Spark菜鸟的进阶之路之RDD编程二

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是惰性求职的,只有在行动操作中用到时才会被计算。


用Scala实现filter()
转化操作

注意:

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都会从头开始计算,要避免这种低效的行为,用户可以将中间结果持久化。

推荐阅读更多精彩内容