PySpark RDD学习笔记-转化操作 行动操作 惰性求值 持久化

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就会在第一个行动操作调用它之后, 驻留在集群里面参与对其求值的各节点的内存中

发布了131 篇原创文章 · 获赞 7 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43064185/article/details/103843105