Rdd依赖
概念
- rdd的特性之一
- 相邻rdd之间存在依赖关系
分类
-
窄依赖
父rdd的一个分区数据对应子rdd的一个分区数,一对一关系
map()/flatmap()/filter
-
宽依赖
父rdd的一个分区数据对应子rdd的多个分区数据,一对多关系
groupby()/groupbykey()/sortby()/sortbykey()/distinc(),reducebykey()/
DAG图计算
- dag图(有方向没有闭环的图像)是来管理rdd之间的依赖关系
- dag图根据rdd的依赖关系划分不同的stage(计算步骤)
- spark应用程序遇到宽依赖就会产生新的stage
- 同一个stage中的rdd之间一定是窄依赖关系
为什么要划分stage计算步骤
- 因为spark的task任务是以线程方式并行计算
- 线程方式并行计算会有资源竞争问题,所以会导致数据丢失造成计算结果不准确
- 通过stage来解决计算不准确问题
- 同一个stage中数据不会进行shuffle过程,多个task并行计算
- 不同stage之间需要等待上一个stage执行完成后(获取所有数据)再执行下一个stage(因为如果不等待的话,会造成数据不准确问题)
df对象和rdd对象的转换
from pyspark.sql import SparkSession
ss=SparkSession.builder.getOrCreate()
sc=ss.sparkContext
rdd1=sc.parallelize([[1,'xiuer',20]])
df1=rdd1.toDF(['id','name','age'])
df1.show()
new_rdd=df1.rdd
rdd_map=new_rdd.map(lambda x:x['age'])
print(rdd_map.collect())