Spark:查找 RDD 的每个分区大小

Spark: Find Each Partition Size for RDD

查找给定 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() 导致了这种情况的发生。不过不管怎样,就是想知道有没有更好的方法呢?

使用:

builder.rdd.mapPartitions(lambda it: [sum(1 for _ in it)])

虽然@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])

找到倾斜分区的键,如果需要,我们可以进一步调试该分区的内容。