Передел, чтобы избежать большого количества маленьких файлов - PullRequest
0 голосов
/ 20 октября 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 20 октября 2018

Вы можете использовать предложение 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
...