Динамические разделы Hive генерируют несколько файлов
У меня есть несколько заданий Hive, которые выполняются в течение дня. Задание выводит данные в Amazon S3. В задании Hive используется динамическое разбиение.
Проблема в том, что когда разные задания должны записывать в один и тот же динамический раздел, они будут генерировать по одному файлу.
Я хотел бы, чтобы последующие задания загружали существующие данные и объединяли их с новыми данными.
Я должен отметить, что запрос, который фактически выводит на S3, является INSERT INTO TABLE
запрос.
2 ответа
Без переписывания всех данных каждый раз это, безусловно, невозможно в Hadoop 1.x, и было бы очень сложно в 2.0.
По сути, hadoop 1.x не поддерживает добавление файлов. Если новый процесс приходит и хочет записать в каталог, он должен создавать новые файлы; невозможно добавить к уже существующим.
Даже если бы можно было добавить (как в 2.0), было бы много условий гонки и других вещей, о которых нужно беспокоиться. Это очень сложная проблема.
Тем не менее, это общая проблема. Типичное решение - позволить вашему процессу добавлять новые файлы и периодически запускать задание "уплотнения", которое просто выполняет что-то вроде:
insert overwrite table my_table partition (foo='bar')
select * from my_table where foo = 'bar'
distribute by foo;
Это должно заставить только один файл быть создан. Однако, опять же, вы должны беспокоиться о состоянии гонки. Либо убедитесь, что у вас включена блокировка, либо только те компактные разделы, в которые, как вы уверены, не пишутся.
Я думаю, что вы можете попробовать вставить вкладку OVERWRITE TABLE