Hive变量替换

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语句中就可以直接引用

你可能感兴趣的:(hive,变量替换)