Раздел Hive таблицы по существующему полю? - PullRequest
5 голосов
/ 09 июля 2011

Можно ли разбить таблицу Hive при вставке по существующему полю?

У меня есть файл размером 10 ГБ с полем даты и полем часа.Можно ли загрузить этот файл в таблицу, а затем вставить-перезаписать в другую многораздельную таблицу, которая использует эти поля в качестве раздела?Хотелось бы что-то вроде следующей работы?

INSERT OVERWRITE TABLE tealeaf_event  PARTITION(dt=evt.datestring,hour=evt.hour) 
SELECT * FROM staging_event evt;

Спасибо!

Трэвис

Ответы [ 4 ]

12 голосов
/ 07 марта 2013

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

Допустим, у вас есть три таблицы, которые были созданы с использованием следующих операторов:

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;

И это должно сделать.

1 голос
/ 17 января 2012

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

0 голосов
/ 23 сентября 2011

Я не уверен в этом, но что-то подобное может сработать

INSERT OVERWRITE TABLE tealeaf_event
SELECT col1 as tealeaf_col1, ..., datestring as ds;
0 голосов
/ 09 июля 2011

Нет.Вам придется удалить это поле или, по крайней мере, переименовать его.

...