Hive中变量和属性命名空间有4种:hivevar、hiveconf、system、env。hivevar命名空间指的是用户自定义的变量,hiveconf命名空间指的是Hive相关属性的配置,system命名空间指的是Java定义的配置属性,env命名空间指的是Shell环境定义的变量信息,如HADOOP_HOME。
进入Hive的CLI,可以使用set这个命令来显示或者修改变量值。使用
set;或者 set -v;
可以显示命名空间 hivevar、hiveconf、system、env 中所有的变量,使用-v参数,还可以显示出Hadoop中定义的所有属性,例如控制HDFS和MapReduce的属性。
1)hivevar
如何定义一个命名空间为hivevar的变量呢?
$ hive --define key=value
简写 $hive -d key=value
或$hive --hivevar key=value
sql语句:
$ hive --define foo=bar;
Logging initialized using configuration in jar:file:/usr/hive/hive-0.12.0/lib/hive-common-0.12.0.jar!/hive-log4j.properties
$hive> set foo;
foo=bar
$hive> set hivevar:foo;
hivevar:foo=bar
$hive> set hivevar:foo=bar2;
$hive> set hivevar:foo;
hivevar:foo=bar2
$hive> set foo;
foo=bar2
由此可以看出,hivevar命名空间中hivevar:前缀是可以省略的,但是system、env等前缀是不可以省略的。所以下面的两个 sql语句是等价的。
$hive> create table toss1(i int, ${hivevar:foo} string);hive> create table toss2(i2 int, ${foo} string);
注意:在CLI中查询语句中的变量引用会先被替换掉,然后才会将查询语句交给查询处理器。
2)hiveconf
hiveconf命名空间下有一个hive.cli.print.current.db属性,该属性的值默认是false,开启该属性可以在CLI提示符前打印出当 前所在的数据库名,默认的数据库名是default。
sql语句
$ hive --hiveconf hive.cli.print.current.db=true
Logging initialized using configuration in jar:file:/usr/hive/hive-0.12.0/lib/hive-common-0.12.0.jar!/hive-log4j.properties
$hive (default)> set hiveconf:hive.cli.print.current.db;
hiveconf:hive.cli.print.current.db=true
$hive (default)> set hiveconf:hive.cli.print.current.db=false;
$hive> set hiveconf:hive.cli.print.current.db=true;
$hive (default)>
3)system和env
system命名空间,Java系统属性对这个命名空间具有可读可写权利;而env命名空间,对于环境变量只提供可读权权限。
用户使用system变量和env变量时,必须使用system:和env:前缀来指定系统属性和环境变量。
env命名空间可以作为向Hive传递变量的一个可选方式,例如:
$ YEAR=2012 hive -e "slect * from mytable where year = ${env:YEAR}";
查询处理器会在where子句中查看到实际的变量值2012。