1、创建RDD
Spark提供了两种创建RDD的方式:
(1)读取外部数据集
(2)在驱动程序中对一个集合进行并行化
创建RDD最简单的方式就是把程序中一个已有的集合传给SparkContext的parallelize()方法(除了在开发原型和测试时,这种方式用的并不多,毕竟这种方式需要把你的整个数据集先放在一台机器的内存中)
更常用的方式是从外部存储中读取数据来创建RDD
2、RDD操作
RDD支持两种操作:transformation和action
RDD的transformation是返回一个新的RDD的操作,比如map() 和 filter() 而action则是向驱动器程序返回结果或把结果写入外部操作系统,会触发实际的计算,比如count() 和 first()
注意:transformation返回的是RDD,而action返回的是其他的数据类型
转化操作
RDD的转化操作是返回新的RDD的操作。转化出来的RDD是惰性求职的,只有在行动操作中用到时才会被计算。
转化操作
注意:
filter() 操作不会改变已有的inputRDD中的数据。实际上,该操作会返回一个全新的RDD,inputRDD在后面的程序中还可以使用
最后要说的是,通过转化操作,你从已有的RDD中派生出新的RDD,Spark会用谱系图来记录这些RDD之间的依赖关系。
Spark需要用这些信息来按需计算每一个RDD,也可以依靠谱系图在持久化的RDD丢失部分数据时恢复所丢失的数据。
行动操作
我们在驱动器中使用了take()获取了RDD的少量元素,然后在本地遍历这些元素,并再驱动器端打印出来。
RDD还有一个collect() 函数,可以用来获取整个RDD中的数据。如果你把你的RDD筛选到一个很小的规模,并且你还想在本地处理这些数据时,就可以使用它。谨记,只有当你的数据集能在单台机器的内存中放得下时,才能使用collect().
在大多数情况下,RDD不能通过collect() 收集到驱动器进程中,因为他们一般都很大,通常把数据写到诸如HDFS这样的分布式存储系统中,可以使用saveAsTextFile()、saveAsSequenceFile() 或者其他任意的行动操作来把RDD中的内容以各种自带的格式保存起来。
需要注意的是,每当我们调用一个新的行动操作时,整个RDD都会从头开始计算,要避免这种低效的行为,用户可以将中间结果持久化。
网友评论