i无法将数据(由set声明)插入到日分区表中

pvabu6sv  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(390)

我有一个按天划分的表。我尝试通过设置

套hivevar:ds=2018-12-01;

然后使用**insert overwrite table xtable partition(day='${hivevar:ds}“)**效果不错
但当我喜欢下面

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

然后**insert overwrite table xtable partition(day='${hivevar:pd}')**这是抛出错误。我认为问题是因为额外的报价,但无法找到如何解决。
错误是:

无法识别“date\u add('''2018'-'常量)附近的输入

代码:

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分区(day=2018-12-01)

7lrncoxx

7lrncoxx1#

@saicharan设置变量时不能添加函数。我也遇到过类似的问题。
套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}') "

这应该能解决你的问题。让我知道它是否有效。

ckocjqey

ckocjqey2#

目前,您正尝试使用静态分区在其规范中插入函数。您可以使用动态分区插入,在数据集中提供分区:

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;

这将起作用,但可能会导致表满扫描,因为分区修剪不适用于函数。因此,最好的解决方案是在shell中计算date-1 day,并将其作为hql脚本中的参数传递:

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

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

在脚本中使用 '${hiveconf:ds}'

相关问题