Как объединить небольшие файлы из существующих разделов в кусте?
Как объединить существующие небольшие файлы раздела в один большой файл в одном разделе.
Например, у меня есть таблица user1, она содержит столбцы fname, lname и раздел столбца day.
Я создал таблицу с помощью сценария ниже
CREATE TABLE user1(строка fname, строка lname) с разделением на (день int);
После вставки данных в таблицу разделов это будет выглядеть ниже.
fname lname day
.....................
AA AAA 20170201 ....>partition 20170201
BB BBB 20170201
...................
CC CCC 20170202 ......>partition 20170202
DD DDD 20170202
....................
EE EEE 20170203 .......>partition 20170203
FF FFF 20170203
.......................
GG GGG 20170204 ........>partition 20170204
HH HHH 20170204
.......................
Когда я выполняю запрос выбора с помощью столбца раздела, т.е. день =20170201.
select * from user1 where day=20170201;
Это даст результат, как показано ниже
AA AAA 20170201
BB BBB 20170201
основываясь на приведенной выше таблице, я хочу объединить все маленькие файлы, то есть, день = 20170201 и день =20170202, и день =20170203, в день раздела =20170203 в моей таблице разделов (т. е. USer1).ie Это должно выглядеть так, как показано ниже.
fname lname day
.....................
AA AAA 20170201
BB BBB 20170201
CC CCC 20170202
DD DDD 20170202
E EEE 20170203 .......>partition 20170203
FF FFF 20170203
.......................
GG GGG 20170204 ........>partition 20170204
HH HHH 20170204
.......................
Можете ли вы предложить по этому вопросу, как я могу добиться этого?
Заранее спасибо.
1 ответ
- Создать новую таблицу, разделенную новым полем
partition_day
:
CREATE TABLE user_new(fname string,lname string, day int) parittioned By (partition_day int);
- Загрузите данные в новую таблицу (задайте условия для новых разделов в
case
)
insert overwrite table user_new partition (partition_day) select fname,lname, day, case when day <= 20170203 then 20170203 when day > 20170203 then 20170204 end as partition_day from user1 ;