PySpark:
num_partitions = 20000
a = sc.parallelize(range(int(1e6)), num_partitions)
l = a.glom().map(len).collect() # get length of each partition
print(min(l), max(l), sum(l)/len(l), len(l)) # check if skewed
Спарк/Scala:
val numPartitions = 20000
val a = sc.parallelize(0 until 1e6.toInt, numPartitions)
val l = a.glom().map(_.length).collect() # get length of each partition
print(l.min, l.max, l.sum/l.length, l.length) # check if skewed
Кредиты: Mike Dusenberry @https://issues.apache.org/jira/browse/SPARK-17817
То же самое можно сделать для фрейма данных, а не только для RDD. Просто добавьте DF.rdd.glom ... в код выше.
Спасибо! Из того, что я понимаю, 'iter.size' выполняет итерацию через весь раздел, чтобы получить его размер (исправьте меня, если я ошибаюсь здесь). Есть ли способ получить размер раздела без повторения через него? – Geo
Я так не думаю. – pzecevic
Правильно. Невозможно узнать размер до тех пор, пока итерация не будет запрошена напрямую, поскольку она более эффективна по памяти, когда данные извлекаются по требованию не все сразу (что не может вписаться в доступную память). –