查找给定RDD的每个分区大小的最佳方法是什么。我正在尝试调试偏斜的分区问题,我试过这个:
l = builder.rdd.glom().map(len).collect() # get length of each partition
print('Min Parition Size: ',min(l),'. Max Parition Size: ', max(l),'. Avg Parition Size: ', sum(l)/len(l),'. Total Partitions: ', len(l))
它适用于小型RDD,但对于更大的RDD,它会产生OOM错误。我的想法是glom()
导致这种情况发生。但无论如何,只是想知道是否有更好的方法来做到这一点?
答案 0 :(得分:11)
使用:
builder.rdd.mapPartitions(lambda it: [sum(1 for _ in it)])
答案 1 :(得分:10)
虽然@LostInOverflow的答案很有效。我找到了另一种方法来查找每个分区的大小和索引,使用下面的代码。感谢this awesome post.
以下是代码:
l = test_join.rdd.mapPartitionsWithIndex(lambda x,it: [(x,sum(1 for _ in it))]).collect()
然后您可以使用以下代码获取最大和最小尺寸分区:
min(l,key=lambda item:item[1])
max(l,key=lambda item:item[1])
找到偏斜分区的键,我们可以根据需要进一步调试该分区的内容。