许多教程都提到RDD
的预分区将优化火花作业的数据重组。我感到困惑的是,对于我的理解,预分区也会导致洗牌,为什么提前洗牌会对某些操作有所帮助?特别是火花它自我将为一组变换做优化。
例如:
如果我想加入两个数据集国家(id,国家)和收入(id,(收入,月份,年份)),这两种操作之间的区别是什么? (我使用PySpark架构)
按ID
进行预分区country = country.partitionBy(10).persist()
income = income.partitionBy(10).persist()
income.join(country)
直接加入,无需预分区:
income.join(country)
如果我只需要计算一次这个连接,在加入之前使用预分区是否仍然有用?我认为partitionBy
也需要洗牌吗?如果我在加入后的进一步计算都是基于使用country作为键(用于连接的前一个键id将无用并从RDD
中删除),我该怎么做才能优化计算?
答案 0 :(得分:1)
如果我只需要计算一次这个连接,在加入之前使用预分区是否仍然有用?我认为partitionBy还需要改组吗?
你是对的。仅当分区数据将被重用于多个DAG路径时,抢占式分区才有意义。如果你join
只是一次它只是在另一个地方洗牌。
答案 1 :(得分:0)
parititionBy
不对数据进行随机播放,如果这就是您的要求。
通过先发制人partitionBy
,你不要避免洗牌。你只需将它推到另一个地方。如果分区RDD多次重复使用,这可能是一个好主意,但是对于一次性连接你没有任何好处。