Spark RDD 读书笔记

来源:互联网 发布:智慧教室 知乎 编辑:程序博客网 时间:2024/06/16 18:06
  1. RDD 简介

Spark 中的RDD 就是一个不可变的分布式对象集合。每个RDD 都被分为多个分区,这些分区运行在集群中的不同节点上。RDD 可以包含Python、Java、Scala 中任意类型的对象,甚至可以包含用户自定义的对象。


用户可以使用两种方法创建RDD:读取一个外部数据集,或在驱动器程序里分发驱动器程序中的对象集合(比如list 和set)。

创建出来后,RDD 支持两种类型的操作: 转化操作(transformation) 和行动操作(action)。转化操作会由一个RDD 生成一个新的RDD。

创建RDD 最简单的方式就是把程序中一个已有的集合传给SparkContext 的parallelize()方法

Python 中的parallelize() 方法
lines = sc.parallelize(["pandas", "i like pandas"])


Spark的惰性计算:  只有在用到的时候才会计算。好处是节省内存空间。

默认情况下,Spark 的RDD 会在你每次对它们进行行动操作时重新计算。如果想在多个行动操作中重用同一个RDD,可以使用RDD.persist() 让Spark 把这个RDD 缓存下来。


RDD的谱系图:


用Python 进行union() 转化操作
errorsRDD = inputRDD.filter(lambda x: "error" in x)
warningsRDD = inputRDD.filter(lambda x: "warning" in x)
badLinesRDD = errorsRDD.union(warningsRDD)


2 向spark传递函数:

1)向python传递函数:

在Python 中,我们有三种方式来把函数传递给Spark。传递比较短的函数时,可以使用lambda 表达式来传递。除了lambda 表达式,我们也可以传递顶层函数或是定义的局部函数。

需要注意:

传递函数时需要小心的一点是,Python 会在你不经意间把函数所在的对象也序列化传出去。当你传递的对象是某个对象的成员,或者包含了对某个对象中一个字段的引用时(例如self.field),Spark 就会把整个对象发到工作节点上,这可能比你想传递的东西大得多。


Map和flatMap的区别:

你可以把flatMap() 看作将返回的迭代器“拍扁”,这样就得到了一个由各列表中的元素组成的RDD,而不是一个由列表组成的RDD。

 map()是将函数用于RDD中的每个元素,将返回值构成新的RDD。

flatmap()是将函数应用于RDD中的每个元素,将返回的迭代器的所有内容构成新的RDD,这样就得到了一个由各列表中的元素组成的RDD,而不是一个列表组成的RDD。


RDD 常见的转化操作:


如果要缓存的数据太多,内存中放不下,Spark 会自动利用最近最少使用(LRU)的缓存策略把最老的分区从内存中移除。对于仅把数据存放在内存中的缓存级别,下一次要用到已经被移除的分区时,这些分区就需要重新计算

原创粉丝点击