Почему я получаю больше разделов после разбиения на разделы на основе столбца с 12 различными значениями - PullRequest
1 голос
/ 03 августа 2020
df = spark.read.format().load(path)

df.write.mode(WriteMode.Overwrite).format().partitionBy("ColumnX").save(path)

Примечание: ColumnX имеет 12 различных значений

df_partitioned = spark.read.format().load(path)

print(df_partitioned.rdd.getNumPartitions())

output: 80

Почему я получаю 80 вместо 12

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

В Spark слово «раздел» относится к разделам памяти и разделам диска. df_partitioned имеет 80 разделов памяти и 12 разделов диска. repartition и coalesce изменяют количество разделов памяти, как описано здесь . partitionBy изменяет количество разделов диска, как описано здесь .

Разделы памяти и разделы диска разные, но терминология заставляет их звучать одинаково, так что вы по понятным причинам запутались.

Все они будут записывать разное количество файлов:

// approach 1
df
  .repartition(col("ColumnX"))
  .write
  .partitionBy("ColumnX")
  .parquet(outputPath)

// approach 2
df
  .repartition(5)
  .write
  .partitionBy("ColumnX")
  .parquet(outputPath)

// approach 3
df
  .repartition(8, col("ColumnX"), rand)
  .write
  .csv(outputPath)
0 голосов
/ 03 августа 2020

Когда вы читаете data / datafram по умолчанию, исходя из терминологии по умолчанию, rdd разделяется. Если вы хотите убедиться, что количество разделов произойдет, используйте repartition (n), когда n - это номер, который вы хотите предоставить.

df.repartition (10) .write.mode (WriteMode.Overwrite) .format () .partitionBy ("ColumnX"). save (путь)

...