当我在 pyspark 中缓存时,数据连接是否需要重新分区

我有一个如下所示的表连接操作


rData = [rd1,rd2,rd3,...] # a list of spark dataframe

# option 1: lData.cache()
# option 2: lData = lData.repartition('joinKey').cache()

result = None
for rd in rData:
    tmp = lData.join(rd,on='joinKey') # lData is a spark dataframe
    result = tmp if not result else result.unionByName(tmp)

如您所见,lData 在针对 rData 元素的数据连接中重复使用。我正在考虑在内存中缓存 lData 以获得良好的数据连接性能(上面代码中的 option 1)。在这种情况下,我是否还应该考虑通过 lDatajoinKey 进行重新分区,以便在针对 rData(上面代码中的 option2 ),还是有必要?谢谢!

ningyaoaa 回答:当我在 pyspark 中缓存时,数据连接是否需要重新分区

Repartition 进行完整的 shuffle,创建新的分区,并提高应用程序中的并行度。更多的分区将有助于处理数据偏斜问题,但会产生额外的成本,即如上所述对完整数据进行洗牌。但是,在查询计划中添加一个 shuffle 可能会消除另外两个 shuffle,并加快运行速度。所以我认为如果你的数据有偏差,那么只有你应该重新分区。

,

当您加入 2 个数据帧时,重新分区将无济于事,它将是 sparks shuffle 服务,它将决定 shuffle 的数量。 对于 E.G. :- 你这样做

lData.repartition(100).join(rData)

把你的默认shuffle partition当成200,你会看到加入的时候你会有200个task,相当于sparks shuffle partition。

而且这种方法效率很低。

下面可以直接使用,不需要循环rdata

lData.join(rData,on='joinKey')
本文链接:https://www.f2er.com/12259.html

大家都在问