Это можно объяснить, просто взглянув на то, как работает функция перераспределения.Причина этого заключается в том, что вызов df.repartition(COL, numPartitions=k)
создаст информационный кадр с k
разделами, использующими разбиение на основе хеша.Pyspark будет проходить через каждую строку и применять следующую функцию , чтобы определить, где закончится элемент в текущей строке:
partition_the_row_belongs_to = hash(COL) % k
k
в этом случае используется для отображениястроки в пространство, состоящее из k разделов.Как видите, бывают случаи, когда хеш-функции сталкиваются.Иногда некоторые разделы будут пустыми, в то время как другие содержат слишком много элементов.Это может быть из-за выводов хэш-карты или из-за хэш-функции.В любом случае причина того, что вы видите, состоит в том, что перераспределение создало 3 раздела, как вы и просили, это не обещает вам ничего о балансировке разделов или о том, что все разделы не пусты.Если вы хотите иметь больше контроля над тем, как выглядят получающиеся разделы, посмотрите на partitionby .
См. Также: этот вопрос и этот вопрос .
Надеюсь, это поможет.