Согласно документации pyspark , repartition
должен использовать хеш-разбиение, что даст несколько неравные размеры разделов.Тем не менее, я обнаружил, что если ему предшествует limit
, то получится точно равного размера раздела.Это можно показать, запустив в оболочке pyspark следующее:
df = spark.createDataFrame([range(5)] * 100)
def count_part_size(part_iter):
yield len(list(part_iter))
print(df.repartition(20).rdd.mapPartitions(count_part_size).collect())
# [4, 4, 4, 5, 4, 4, 5, 4, 5, 6, 6, 6, 7, 5, 5, 5, 5, 6, 5, 5]
print(df.limit(100).repartition(20).rdd.mapPartitions(count_part_size).collect())
# [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
Если repartition
использует разделитель хеша, почему в этом случае он получит абсолютно равные размеры разделов?И если он не использует хеш-разделитель, какой тип разделителя он использует?
Кстати, я использую python версии 2.7.15 и spark версии 2.0.2