Динамическое разделение улья

#hadoop #hive #hiveql

#hadoop #улей #hiveql

Вопрос:

Я пытаюсь создать секционированную таблицу с использованием динамического разбиения, но я столкнулся с проблемой. Я использую Hive 0.12 в песочнице Hortonworks 2.0.

 set hive.exec.dynamic.partition=true;
INSERT OVERWRITE TABLE demo_tab PARTITION (land)
SELECT stadt, geograph_breite, id, t.country
FROM demo_stg t;
  

однако это не работает.. Я получаю сообщение об ошибке.

Вот запрос для создания таблицы demo_stg:

 create table demo_stg
(
    country STRING,
    stadt STRING,
    geograph_breite FLOAT,
    id INT
    )
ROW FORMAT DELIMITED FIELDS TERMINATED BY "73";
  

И demo_tab:

 CREATE TABLE demo_tab 
(
    stadt STRING,
    geograph_breite FLOAT,
    id INT
)
PARTITIONED BY (land STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "73";
  
  • Таблица demo_stg также заполнена данными, поэтому она не пуста.

Спасибо за помощь 🙂

Комментарии:

1. Какую ошибку вы получаете?

2. Также попробуйте добавить SET hive.exec.dynamic.partition.mode = nonstrict;

3. Если я попытаюсь запустить «SET hive.exec.dynamic.partition.mode = nonstrict;», я получаю сообщение об ошибке. И каждое сообщение об ошибке, которое я получаю, выглядит так: «Произошла ошибка при выполнении запроса улья: неизвестное исключение».

Ответ №1:

Вам необходимо изменить свой выбор:

 set hive.exec.dynamic.partition=true;
INSERT OVERWRITE TABLE demo_tab PARTITION (land)
SELECT stadt, geograph_breite, id, t.country
FROM demo_stg t;
  

Я не уверен, в какой столбец на вашем демонстрационном этапе вы хотите выполнить разбиение или какой столбец в демо соответствует земле. Но каким бы ни был столбец, он должен присутствовать в качестве последнего столбца в select скажем, имя столбца вашей демонстрационной таблицы — id, поэтому ваш выбор должен быть записан как:

 INSERT OVERWRITE TABLE demo_tab PARTITION (land)
SELECT stadt, geograph_breite, id, t.country,t.id as land
FROM demo_stg t;
  

Я думаю, это должно сработать.

Комментарии:

1. Спасибо за вашу помощь 🙂 Выберите: «ВСТАВИТЬ ПЕРЕЗАПИСАТЬ ТАБЛИЦУ demo_tab РАЗДЕЛ (земля) ВЫБЕРИТЕ stadt, geograph_breite, id, т.е.страну,t.id как земля ИЗ demo_stg t;» работает!

2. Я рад, что это сработало. И приветствую вас. Кроме того, если у вас есть несколько столбцов для выбора раздела, они должны содержать несколько столбцов as в порядке, который вы указываете в предложении PARTITION после инструкции insert. Несколько дней назад я написал блог по тому же @ exploredatascience.blogspot.in/2014/06 /…

3.Из документа: dynamic partition columns must be specified last among the columns in the SELECT statement and in the same order in which they appear in the PARTITION() clause cwiki.apache.org/confluence/display/Hive /…

Ответ №2:

Столбец раздела должен быть последним столбцом в запросе выбора.

И еще одна вещь, помимо установки для раздела значения true, вам нужно установить режим на нестрогий:

 set hive.exec.dynamic.partition.mode=nonstrict