Если данные не содержат такой столбец, вы можете использовать

аюсь записать большой разделенный набор данных на диск с помощью Spark иpartitionBy Алгоритм борется с обоими подходами, которые я пробовал.

Перегородки сильно перекошены - некоторые перегородки массивные, а другие крошечные.

Проблема № 1:

Когда я использую передел передrepartitionBySpark записывает все разделы в один файл, даже огромные

val df = spark.read.parquet("some_data_lake")
df
  .repartition('some_col).write.partitionBy("some_col")
  .parquet("partitioned_lake")

Это выполняется вечно, потому что Spark не записывает большие разделы параллельно. Если один из разделов имеет 1 ТБ данных, Spark попытается записать все 1 ТБ данных в один файл.

Проблема № 2:

Когда я не пользуюсьrepartitionSpark пишет слишком много файлов.

Этот код запишет безумное количество файлов.

df.write.partitionBy("some_col").parquet("partitioned_lake")

Я запустил это на крошечном подмножестве данных 8 ГБ, и Spark записал более 85 000 файлов!

Когда я попытался запустить это для производственного набора данных, один раздел с 1,3 ГБ данных был записан в виде 3100 файлов.

Что бы я хотел

Я бы хотел, чтобы каждый раздел записывался в виде файлов размером 1 ГБ. Таким образом, раздел с 7 ГБ данных будет записан в виде 7 файлов, а раздел с 0,3 ГБ данных будет записан в виде одного файла.

Какой мой лучший путь вперед?

Ответы на вопрос(1)

Ваш ответ на вопрос