Я просто наткнулся на это, пытаясь ответить на тот же вопрос, и это было полезно, но не совсем завершено. Короткий ответ - да, что-то вроде запроса в вопросе будет работать, но синтаксис не совсем правильный.
Допустим, у вас есть три таблицы, которые были созданы с использованием следующих операторов:
CREATE TABLE staging_unpartitioned (datestring string, hour int, a int, b int);
CREATE TABLE staging_partitioned (a int, b int)
PARTITIONED BY (datestring string, hour int);
CREATE TABLE production_partitioned (a int, b int)
PARTITIONED BY (dt string, hour int);
Столбцы a
и b
- это только некоторые примеры столбцов. dt
и hour
- это значения, которые мы хотим разделить, как только они попадут в рабочую таблицу. Перемещение промежуточных данных в производство из staging_unpartitioned
и staging_partitioned
выглядит точно так же.
INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
SELECT a, b, datestring, hour FROM staging_unpartitioned;
INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
SELECT a, b, datestring, hour FROM staging_partitioned;
Здесь используется процесс, называемый динамическим разбиением, о котором вы можете прочитать здесь . Важно отметить, что столбцы, связанные с какими разделами, определяются порядком SELECT. Все динамические разделы должны быть выбраны последними и в порядке.
Существует вероятность того, что при попытке запустить приведенный выше код вы получите ошибку из-за установленных вами свойств. Во-первых, он не будет работать, если у вас отключено динамическое разбиение, поэтому убедитесь, что:
set hive.exec.dynamic.partition=true;
Тогда вы можете получить ошибку, если не разбиваете хотя бы один статический раздел перед динамическими разделами. Это ограничение спасет вас от случайного удаления корневого раздела, если вы собираетесь перезаписать его подразделы динамическими разделами. По моему опыту, такое поведение никогда не было полезным и часто раздражало, но ваш пробег может отличаться. В любом случае, это легко изменить:
set hive.exec.dynamic.partition.mode=nonstrict;
И это должно сделать.