许多教程提到 RDD
将优化spark作业的数据洗牌。我困惑的是,对于我的理解,预分区也会导致洗牌,为什么在这里提前洗牌会有利于一些操作?特别是spark-it-self将对一组变换进行优化。
例如:
如果我想加入两个数据集country(id,country)和income(id,(income,month,year)),这两种操作有什么区别(我使用pyspark模式)
按id预分区
country = country.partitionBy(10).persist()
income = income.partitionBy(10).persist()
income.join(country)
无需预分区直接连接:
income.join(country)
如果我只需要计算这个连接一次,那么在连接之前使用预分区是否仍然有用?我想 partitionBy
也需要洗牌对吗?如果我在join之后的进一步计算都是基于使用country作为键(以前用于join的键id将是无用的,并且将从 RDD
),如何优化计算?
2条答案
按热度按时间xmjla07d1#
parititionBy
如果这是您要问的问题,则不洗牌数据。通过应用
partitionBy
你不能先发制人地避开洗牌。你只要把它推到另一个地方。如果分区rdd被多次重用,这是一个好主意,但是一次性的连接没有任何好处。bxpogfeg2#
如果我只需要计算这个连接一次,那么在连接之前使用预分区是否仍然有用?我认为分区也需要洗牌,对吗?
你完全正确。只有在分区数据将被多个dag路径重用时,抢占式分区才有意义。如果你
join
只有一次它只是在另一个地方移动。