Передел, чтобы избежать большого количества маленьких файлов
В настоящее время у меня есть задание 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