Передел, чтобы избежать большого количества маленьких файлов

В настоящее время у меня есть задание ETL, которое читает несколько таблиц, выполняет определенные преобразования и записывает их обратно в ежедневную таблицу.

Я использую следующий запрос в spark sql "INSERT INTO dbname.tablename PARTITION (year_month) SELECT * from Spark_temp_table" Таблица назначения, в которую вставляются все эти записи, разбивается на уровне года X месяца. Записи, которые генерируются ежедневно, не так много, поэтому я делю их на уровне года X месяца.

Тем не менее, когда я проверяю раздел, он имеет небольшие ~50 МБ файлы для каждого дня выполнения моего кода (код должен выполняться ежедневно), и в итоге у меня будет около 30 файлов в моем разделе общим объемом ~1500 МБ

Я хочу знать, есть ли способ для меня просто создать один (или, может быть, 2-3 файла согласно ограничениям размера блока) в одном разделе, в то время как я добавляю свои записи ежедневно

Я думаю, что смогу сделать это, просто прочитав все из соответствующего раздела в моем искровом фрейме данных, добавив его с последней записью и переделив еще раз перед записью. Как я могу гарантировать, что я только читаю данные из соответствующего раздела и только этот раздел перезаписан с меньшим количеством файлов?

1 ответ

Ты можешь использовать DISTRIBUTE BY условие для управления тем, как записи будут распределяться в файлах внутри каждого раздела.

чтобы иметь один файл на раздел, вы можете использовать DISTRIBUTE BY year, month

и иметь 3 файла на раздел, вы можете использовать DISTRIBUTE BY year, month, day % 3

полный запрос:

INSERT INTO dbname.tablename 
PARTITION(year_month) 
SELECT * from Spark_temp_table
DISTRIBUTE BY year, month, day % 3
Другие вопросы по тегам