hive传递参数有三种方法:
--hivevar : 传参数 ,提供给用户自定义变量。
--hiveconf : 传参数,包括了hive-site.xml配置的hive相关配置属性。
--define : 与hivevar定义变量是一致的。
一、语法:
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database <databasename> Specify the database to use
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-H,--help Print help information
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the
console)
用法很简单:hive --hivevar k1=v1 --hivevar k2=v2 --hiveconf k3=v3
注意:这种方式传参,适用与 hive -f 或者直接 hive 执行语句,hive -e 不会生效
二、作用域
hivevar与hiveconf作用域都是会话级别的,也就是在同一台主机启动两个hive会话,参数是不会相互覆盖的
三、使用
在语句中,通过 ${hiveconf:key}、${hivevar:key} 引用参数
举个栗子:
hive --hivevar var1=1 --hivevar var1=2 --hivevar VAR1=3 --hiveconf var1=4 --hiveconf var2=5 --hiveconf VAR2=6
>select
> '${hiveconf:hive.metastore.warehouse.dir}',
> '${hivevar:var1}',
> '${hivevar:VAR1}',
> '${hiveconf:var1}',
> '${var1}',
> '${hiveconf:var2}',
> '${var2}',
> '${hiveconf:VAR2}'
>;
+-----------------------+------+------+------+------+------+----------+------+
| _c0 | _c1 | _c2 | _c3 | _c4 | _c5 | _c6 | _c7 |
+-----------------------+------+------+------+------+------+----------+------+
| /user/hive/warehouse | 2 | 3 | 4 | 2 | 5 | ${var2} | 6 |
+-----------------------+------+------+------+------+------+----------+------+
hive --hivevar var=12.34.56
> select ${hivevar:var};
Error: Error while compiling statement: FAILED: ParseException line 1:13 cannot recognize input near '56' '<EOF>' '<EOF>' in expression specification (state=42000,code=40000)
> select '${hivevar:var}';
+-----------+
| _c0 |
+-----------+
| 12.34.56 |
+-----------+
1 row selected (2.993 seconds)
从上面可以得出结论:
1、后面传入的变量值会覆盖前面的变量值
2、可以通过 hiveconf 获得 hive 相关配置
3、变量名称大小写敏感(hivevar和hiveconf都是)
4、hivevar 和 hiveconf 的变量是独立的
5、hivevar可以不加前缀 hivevar:,直接${key}使用;而 hiveconf必须 ${hiveconf:key}
6、不存在的变量会将整个当成值,而不是引用变量
7、hivevar仅仅只是简单的文本替换,并不考虑数据类型
四、Impala传递参数
impala-shell --var=myvar=test --var=MyVar=try
>select
> '${Var:myvar}',
> '${Var:MyVar}'
>;
+-------+-------+
| 'try' | 'try' |
+-------+-------+
| try | try |
+-------+-------+
结论:Impala变量名称大小写不敏感
注意:变量没有定义会报错:Error: Unknown variable XXX