Если данные не содержат такой столбец, вы можете использовать
аюсь записать большой разделенный набор данных на диск с помощью Spark иpartitionBy
Алгоритм борется с обоими подходами, которые я пробовал.
Перегородки сильно перекошены - некоторые перегородки массивные, а другие крошечные.
Проблема № 1:
Когда я использую передел передrepartitionBy
Spark записывает все разделы в один файл, даже огромные
val df = spark.read.parquet("some_data_lake")
df
.repartition('some_col).write.partitionBy("some_col")
.parquet("partitioned_lake")
Это выполняется вечно, потому что Spark не записывает большие разделы параллельно. Если один из разделов имеет 1 ТБ данных, Spark попытается записать все 1 ТБ данных в один файл.
Проблема № 2:
Когда я не пользуюсьrepartition
Spark пишет слишком много файлов.
Этот код запишет безумное количество файлов.
df.write.partitionBy("some_col").parquet("partitioned_lake")
Я запустил это на крошечном подмножестве данных 8 ГБ, и Spark записал более 85 000 файлов!
Когда я попытался запустить это для производственного набора данных, один раздел с 1,3 ГБ данных был записан в виде 3100 файлов.
Что бы я хотел
Я бы хотел, чтобы каждый раздел записывался в виде файлов размером 1 ГБ. Таким образом, раздел с 7 ГБ данных будет записан в виде 7 файлов, а раздел с 0,3 ГБ данных будет записан в виде одного файла.
Какой мой лучший путь вперед?