Hive的变量前面有一个命名空间,包括三个hiveconf,system,env 和 hivevar
1. hiveconf的命名空间指的是hive-site.xml下面的配置变量值。
2. system的命名空间是系统的变量,包括JVM的运行环境。
3. env的命名空间,是指环境变量,包括Shell环境下的变量信息,如HADOOP_HOME之类的
普通的变量可以使用
--define key=value
或者 --hivevar key=value
来声明,这都代表是hivevar,的变量。 这两种方式只能与hive -e 一起使用。
如:
$ hive --define key=value
简写 hive -d key=value
或
$ hive --hivevar key=value
添加多个变量的时候如下:
$ hive --define a='a' --define b='b'
对于使用hivevar,前缀是可有可无的,如:
hive> create table toss1(i int, ${hivevar:foo} string);
等价于
hive> create table toss2(i2 int, ${foo} string);
但是对于使用命名空间如hiveconf,system,env的,前缀则不可少
在hive下面,可以通过
set;
或者
set -v;
来查看现有环境的所有变量的值。加上 -v参数,可以获取到HDFS和MapReduce的环境变量信息。
hive -e命令行中支持的变量替换:
1)--define val=value 或者 -d var=value // 同--hivevar
2)--hivevar var=value // 使用${hivevar:var}或者${var}替换
3)--hiveconf var=value // 使用${hiveconf:var}替换
4) 在hive Cli中使用set var=value设置 <==> --hiveconf // 同--hiveconf
举例:
hive> set CURRENT_DATE='2012-09-16'; // set var <==> set hiveconf:var
hive> select * from foo where day >= '${hiveconf:CURRENT_DATE}'
similarly, you could pass on command line:
hive -f 命令行支持的变量替换:
执行SQL文件,命令行只支持使用--hiveconf
hive -f xxx.hql(每个--hiveconf只能定义一个变量,定义多个时使用多次--hiveconf)
$ hive --hiveconf CURRENT_DATE='2012-09-16' --hiveconf SINCE_DATE='2012-08-01' -f test.hql
又或者:
$ hive -hiveconf mapred.job.queue.name=queue2 -e "set mapred.job.queue.name;"
但是在hql文件中变量的替换支持
1)set var=value // 使用${hiveconf:var}替换
2)set hiveconf var=value // 使用${hiveconf:var}替换
3)set hivevar var=value // 使用${hivevar:var}替换,或者 ${var}直接替换
hive与shell的组合:
1、
shell脚本中定义的变量可以直接在hql中引用
例如:
#!/bin/bash
tablename="student"
limitcount="8"
hive -S -e "use test; select * from ${tablename} limit ${limitcount};"
由于hive自身是类SQL语言,缺乏shell的灵活性和对过程的控制能力,所以采用shell+hive的开发模式非常常见,在shell中直接定义变量,在hive -e语句中就可以直接引用