如何将查询的输出存储在HIVE中的变量中

时间:2018-01-08 23:32:33

标签: hive hiveql

我想将current_day - 1存储在Hive的变量中。我知道这个主题已有先前的主题,但是那里提供的解决方案首先建议在shell环境中定义hive外部的变量,然后在Hive中使用该变量。

Storing result of query in hive variable

我首先使用

获得了current_Date - 1
 select date_sub(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'),1);

然后我尝试了两种方法:

1. set date1 = ( select date_sub(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'),1);

and 

2. set hivevar:date1 = ( select date_sub(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'),1);

两种方法都抛出错误:

"ParseException line 1:82 cannot recognize input near 'select' 'date_sub' '(' in expression specification"

当我打印(1)代替昨天的日期时,选择查询将保存在变量中。 (2)方法抛出" {hivevar:dt_chk}未定义 "

我是Hive的新手,非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

Hive不支持将查询结果存储到变量的简单方法。您必须使用shell选项和hiveconf

date1 = $(hive -e "set hive.cli.print.header=false; select date_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),1);")
hive -hiveconf "date1"="$date1" -f hive_script.hql

然后在您的脚本中,您可以引用新创建的可变日期1

select '${hiveconf:date1}'

答案 1 :(得分:0)

经过大量研究,这可能是实现将变量设置为SQL输出的最佳方法:

INSERT OVERWRITE LOCAL DIRECTORY '<home path>/config/date1'
select CONCAT('set hivevar:date1=',date_sub(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'),1)) from <some table> limit 1;
source <home path>/config/date1/000000_0;

随后,您将可以在后续的SQL中使用${date1}

在这里,我们必须使用限制1,因为如果我们未指定表名,则配置单元会出现插入覆盖错误。