如何在hive脚本中传递多个参数

时间:2017-10-09 20:48:15

标签: shell hive hiveql

雇员: Table data

我想通过运行hive脚本sample.hql来获取year = 2016的记录。

use octdb;
select * from '${hiveconf:table}' where year = '${hiveconf:year}';

[cloudera@quickstart ~]$ hive -hiveconf table='employee', year=2016 -f sample.hql

但我收到错误NoViableAltException(307 @ []).......

4 个答案:

答案 0 :(得分:7)

您需要使用--hiveconf选项两次:

hive --hiveconf table=employee --hiveconf year=2016 -f sample.hql

答案 1 :(得分:0)

通过让R& D找到正确的答案,$ {hiveconf:table}应该在没有''的脚本中定义。 sample.hql: -

use ${hiveconf:database};

   select * from ${hiveconf:table} where year = ${hiveconf:year};

运行sample.hql

[cloudera@quickstart shell]$ hive -hiveconf database=octdb -hiveconf table=employee -hiveconf year=2016 -f sample.hql

使用文件中的配置初始化日志:/etc/hive/conf.dist/hive-log4j.properties 行

Time taken: 1.484 seconds
OK
1       A       2016
2       B       2016
4       D       2016

所用时间:4.423秒,提取:3行

答案 2 :(得分:0)

传递变量也可以通过“ hivevar”以及“ hiveconf”来实现。

这里是区别:

添加了hiveconf命名空间,应使用(-hiveconf)设置Hive配置值。

添加了hivevar命名空间,应使用(-hivevar)定义用户变量。

也可以使用hiveconf,但不建议将其用于变量替换,因为为此明确创建了hivevar。

set hivevar:YEAR=2018;
SELECT * from table where year=${YEAR};

hive --hiveconf var='hello world' -e '!echo ${hiveconf:var};'
-- this will print: hello world

答案 3 :(得分:0)

对于更新的Hive版本,您应该使用--hivevar。早期,开发人员能够使用--hiveconf来设置配置,并且它还用于变量。但是,后来的--hivevar被实现为HIVE-2020中提到的变量具有单独的命名空间。

与蜜蜂一起使用

beeline --hivevar table=employee --hivevar year=2016 -f sample.hql

有了这个,您可以在Hive脚本文件中直接访问此变量,也可以使用如下的hivevar命名空间。

select * from ${table};
select * from ${hivevar:table};

请注意,您可能需要使用-u <db_URL>选项指定URL字符串。