【问题标题】:I was not able to insert data(which is declared by set) into day partitioned table我无法将数据(由 set 声明)插入到日期分区表中
【发布时间】:2019-01-23 20:57:34
【问题描述】:

我有一个按天分区的表。我尝试通过设置插入数据

设置 hivevar:ds=2018-12-01;

然后使用** INSERT OVERWRITE table XTABLE partition(day='${hivevar:ds}') ** 这工作正常

但是当我喜欢下面的时候

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

然后 ** INSERT OVERWRITE 表 XTABLE 分区(day='${hivevar:pd}') ** 它正在抛出错误。我认为问题是因为额外的引号但无法找到解决方法。

错误是:

无法识别常量中 ''date_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)

【问题讨论】:

    标签: hive hiveql


    【解决方案1】:

    目前您正在尝试使用具有规范中的功能的静态分区进行插入。您可以使用动态分区插入,在数据集中提供分区:

    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}'

    【讨论】:

    • 感谢@leftjoin 的回复。但我想从 hive 命令 shell 运行查询。
    • @saicharan 然后在我的回答中使用第一个脚本
    • 按照你的建议,我使用了这个。 设置 hivevar:ds=2018-12-01;设置 hive.exec.dynamic.partition.mode=nonstrict; INSERT OVERWRITE table XTABLE partition(day) select distinct d.emp_id, d.start_time, d.end_time,d.day from ( select emp_id, start_time, end_time, date_sub('${hivevar:ds}',1) as day - - 数据集中存在的分区,也可以是 date_sub('${hivevar:ds}',1) as day from XTABLE where day=date_sub('${hivevar:ds}',1) ) d;但它正在传递这个信息。将数据加载到表 xtable 分区(day=null)。 day 在那里不应该为空
    • 检查返回的内容:set hivevar:ds=2018-12-01;选择 date_sub('${hivevar:ds}',1);
    • 会不会是你没有执行 set hivevar:ds=2018-12-01;之前?并检查没有插入的整个选择返回什么
    【解决方案2】:

    @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}') "
    

    这应该可以解决您的问题。让我知道它是否有效。

    【讨论】:

    • 感谢@Sagar Morakhia 的回复。这是可行的,但我希望这完全可以从 hive 命令 shell 完成
    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多