RDD编程
弹性式分布数据集(ResilientDistributed Dataset,简称RDD)。RDD其实就是分布式元素集合。在Spark中对数据的所有操作不外乎创建RDD,转化已有的RDD以及调用RDD操作经行求值。
RDD就是一个不可变的分布式对象集合。每个RDD都会被分为多个分区,这些分区运行在集群中的不同节点上。
RDD支持两种类型的操作:转化操作和行动操作。
转化操作:由一个RDD生成一个新的RDD
行动操作:对RDD计算一个结果,并把结果返回到驱动器程序中,或者把结果存储到外部存储系统(如,HDFS)中。
惰性:RDD只有第一次在一个行动操作中用到时,才会真正计算。
Spark了解了完整的转化操作链时,它就可以只计算求结果时真正需要的数据。例如,在行动操作first()中,Spark只需要扫描文件直到找到第一个匹配的行为止,而不需要读取整个文件。
在任何时候我们都可以对RDD经行重算是我们把RDD描述为“弹性”的原因。
当对数据反复操作时,可以用RDD.persist()让Spark把这个RDD缓存下来。
如果不会重用该RDD,我们就没必要浪费存储空间,可以遍历一遍数据计算结果即可。
总结
从外部数据创建出输入RDD。
使用诸如first()河阳的转化操作对RDD经行转化,以定义新的RDD。
告诉Spark对需要被冲用的中间结果RDD执行persist()操作。
使用行动操作(例如count()和first()等)来触发一次并计算,Spark会对计算经行优化后再执行。
创建RDD
创建RDD最简单的方式就是把程序中一个已有的集合传给SparkContext的parallelize()。
val lines =sc.parallelize(List(“pandas”,”I like pandas”))
外部数据集的读取
val lines = sc.textFile(“README.md”)
RDD操作
转化操作
RDD的转化操作是返回新的RDD的操作。转化出来的RDD是惰性求值的,只有在行动操作中用到这些RDD时才会被计算。
行动操作
行动操作会把最终结果返回到驱动程序中。
val text =sc.textFile(“README.md”)
text.take(10).foreach(println)
RDD中还有一个collect()函数,可以用来获取整个RDD中的数据。如果你的程序把RDD筛选到一个很小的规模,并且你想在本地出来这些数据时。但是,只有当你的整个数据集能在单台机器的内存中放得下时,才能使用collect(),因此,collect()不能用在大规模数据集上。
Tips:
在大多数情况下,RDD不能通过collect()收集到驱动进程中,因为它们一般都很大。因此,我们通常把这些数据写到诸如HDFS这样的分布式的存储系统中。