RDD核心概念
Spark中的转化操作是操作RDD并返回一个新的RDD的函数, 而行动操作是操作RDD并返回一个值或进行输出.
粗粒度转化出操作对比细粒度转化操作
粗粒度: 对RDD进行的操作被认为是粗粒度的, 因为操作会把函数作用于数据集里的每个一元素, 并返回转化操作应用后得到的新数据集.
细粒度: 转化转化操作可以操控单条记录或者单元格, 比如关系型数据库里面单条记录更新, 或者是NoSQL数据库最漂亮个的put操作.
转化操作 行动操作 惰性求值
转化操作是对RDD进行的产生新的RDD的操作 常见的转化操作包括map和filter函数
originalrdd = sc.parallelize([0,1,2,3,4,5,6,7,8])
newrdd = originalrdd.filter(lambda x: x % 2)
与返回行的RDD对象的转化操作相反, 行动操作向驱动器程序返回值或者数据. 常见的行动操作包括reduce() collect() count(), 还有saveAsTextFile()
# 换回[1, 3, 5, 7]
newrdd.collect()
在处理Spark程序时, 使用的惰性求值, 也叫作惰性执行. 惰性求值将处理过程推到调用行动操作时,(也就是需要进行输出时).惰性求值让Spark可以尽可能罪和各种操作, 这样可以减少处理的阶段, 在数据混洗的过程里最小化在Spark执行器间传输的数据量.
RDD持久化与重用
RDD创建和存在于执行器的内存中. 默认情况下, RDD是易逝对象, 仅在需要时侯存在. 如果一个RDD在多个行动操作中用到, 就会产生问题, 因为这个RDD每次都需要整个重新求值.
解决这个问题的一种方式就是使用persist()方法缓存或者持久化RDD
num = sc.range(0, 1000000, 1, 2)
evens = num.filter(lambda x: x % 2)
evens.persist()
# 指示Spark在下个行动操作需要evens RDD时进行持久化
noelements = evens.count()
# 处理evens RDD并持久化在内存中
print('数据量", noelements)
# 换回 数据量, 500000
listofelements = evens.collect()
# 不用重新计算evens RDD
print('前五位数据', listofelements[:5])
# 返回 [1,3,5,7,9]
如果使用persist()方法(注意还有个类似的cache()方法)请求了持久化RDD, RDD就会在第一个行动操作调用它之后, 驻留在集群里面参与对其求值的各节点的内存中