Улей: Вставить, перезаписать несколько разделов

На сегодняшний день у меня есть таблица Hive, разделенная на разделы. Я хочу иметь возможность выборочно перезаписывать разделы за последние n дней (или настраиваемый список разделов).

Есть ли способ сделать это без написания инструкции «INSERT OVERWRITE DIRECTORY» для каждого раздела?

Любая помощь приветствуется.


person rahul    schedule 06.09.2013    source источник


Ответы (2)


Hive поддерживает динамическое разбиение на разделы, поэтому вы можете создать запрос, в котором раздел является всего лишь одним из полей источника.

INSERT OVERWRITE TABLE dst partition (dt) 
SELECT col0, col1, ... coln, dt from src where ...

В предложении where можно указать, какие значения dt вы хотите перезаписать.

Просто включите поле раздела (в данном случае dt) последним в списке из источника, вы даже можете сделать SELECT *, dt, если поле dt уже является частью источника или даже SELECT *,my_udf(dt) as dt и т. Д.

По умолчанию Hive хочет, чтобы хотя бы один из указанных разделов был статическим, но вы можете разрешить ему быть нестрогим; поэтому для вышеуказанного запроса вы можете установить следующее перед запуском:

set hive.exec.dynamic.partition.mode=nonstrict;
person libjack    schedule 09.09.2013
comment
если я делаю SELECT *, dt, он жалуется, что я вставляю больше столбцов. Это имеет смысл, поскольку dt также является частью *. Если я делаю SELECT col0, col1, ... coln, dt from src where, он жалуется Partition spec {dt=, DT=12} contains non-partition columns; Есть идеи? Кажется, понравились случаи в столбце раздела, но я пробовал оба - person nir; 02.08.2018

Попробуй это . Это исключит dt из *, а затем добавление dt установит требуемый порядок:

SET hive.support.quoted.identifiers=none;
INSERT OVERWRITE TABLE dst partition (dt)
SELECT `(dt)?+.+`, dt from tableName;
person Balaram Raju    schedule 04.01.2020