Мне не удалось вставить данные (которые объявлены множеством) в разделенную на день таблицу - PullRequest
0 голосов
/ 23 января 2019

У меня есть таблица, которая разбита по дням. Я попытался вставить данные, установив

установить Hivevar: DS = 2018-12-01;

затем с использованием ** INSERT OVERWRITE таблицы XTABLE раздел (день = '$ {hivevar: ds}') ** который отлично работает

но когда мне нравится, как показано ниже

set hivevar: pd = date_add ('$ {hivevar: ds}', - 1);

затем ** INSERT OVERWRITE таблица XTABLE раздел (день = '$ {hivevar: pd}') ** это ошибка. я думаю, что проблема из-за лишних кавычек, но не в состоянии найти, как решить.

ошибка:

не может распознать ввод около '' date_add ('' '2018' '-' в константе

MYCODE:


set hivevar:ds=2018-12-01;
set hivevar:pd=date_add('${hivevar:ds}',-1);
set hive.exec.dynamic.partition.mode=nonstrict;

CREATE TABLE IF NOT EXISTS XTABLE (emp_id BIGINT, start_time STRING, end_time STRING)
PARTITIONED BY(day STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';


--THIS IS WORKING FINE
INSERT OVERWRITE table XTABLE partition(day='${hivevar:ds}')
select distinct d.emp_id, d.start_time, d.end_time from
(
select emp_id, start_time, end_time from XTABLE where day='${hivevar:ds}'
) d;


--THIS IS THROWING AN ERROR cannot recognize input near ''date_add('' '2018' '-' in constant
--SEEMS PROBLEM IS WHILE SETTING THE VARIABLE
INSERT OVERWRITE table XTABLE partition(day='${hivevar:pd}')
select distinct d.emp_id, d.start_time, d.end_time from
(
select emp_id, start_time, end_time from XTABLE where day='${hivevar:pd}'
) d;

в случае успеха выдается сообщение, как показано ниже:

Загрузка данных в раздел таблицы xtable (день = 2018-12-01)

Ответы [ 2 ]

0 голосов
/ 23 января 2019

В настоящее время вы пытаетесь вставить используя статический раздел с функцией в его спецификации. Вы можете использовать динамическую вставку раздела, предоставив раздел в наборе данных:

set hivevar:ds=2018-12-01;

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

INSERT OVERWRITE table XTABLE partition(day)
select distinct d.emp_id, d.start_time, d.end_time from
(
select emp_id, start_time, end_time, day --partition present in dataset, also it can be date_sub('${hivevar:ds}',1) as day
from XTABLE where day=date_sub('${hivevar:ds}',1);
) d; 

Это будет работать, но может привести к полному сканированию таблицы, так как удаление разделов не работает с функциями. Итак, лучшее решение - это вычислить дату-1 в оболочке и передать ее в качестве параметра в HQL-скрипте:

ds=$(date +"%Y-%m-%d" --date " -1 day")

hive --hiveconf ds="$ds" -f your_script.hql

А внутри вашего скрипта используйте '${hiveconf:ds}'

0 голосов
/ 23 января 2019

@ saicharan Вы не можете добавить функцию при установке переменной. Я столкнулся с подобной проблемой.

set hivevar: ds = 'всегда должно иметь статическое значение'

Чтобы решить эту проблему, вам нужно создать простой скрипт, как показано ниже:

ds=`date -d "+1 day" +"%Y-%m-%d"`
echo $ds

hive --hivevar ds="${ds}" -e "INSERT OVERWRITE table XTABLE partition(day='${hivevar:ds}') "

Это должно решить вашу проблему. Дайте мне знать, если это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...