Spark: найдите каждый размер раздела для 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() вызывает это. Но так или иначе, просто хотел узнать, есть ли лучший способ сделать это?

Ответ 1

Использование:

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

Ответ 2

В то время как ответ от @LostInOverflow отлично работает. Я нашел другой способ найти размер, а также индекс каждого раздела, используя приведенный ниже код. Благодаря этот удивительный пост.

Вот код:

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])

Поиск ключа перекошенного раздела, мы можем дополнительно отладить содержимое этого раздела, если это необходимо.