Hadoop及其上的应用技术,因为之前一直做关系数据库系统的开发与维护,在众多基于Hadoop的技术中,Hive与Hbase的使用方法一直是自己关注的重点。为了对Hive技术有一个准确的认识,开始着手研究Hive的官方技术文档。在阅读的时候顺手按照自己的理解翻译出来,写在博客上,权当然阅读本记,纯属自娱自乐,如果能给浏览的诸君带来些许的参考,那真是不胜荣幸之至。而理解与翻译不确切的地方,还请大家海涵。
一、介绍
在Hive交互Shell模式下。通过使用Hive变量替换,可以减少重复输入那些可用于Hive命令的被插入到脚本语言中的一些代码。例如:
$ a=b
$ hive -e " describe $a "
尽管Hive与脚本语言的紧密结合让使用者感觉复杂,但是当执行比较复杂的类似Hive –e批处理命令时,可以有效减少Hive启动时间的占比。Hive 变量跟Set配合使用,实现强大的替换能力,例如执行如下命令:
$ bin/hive --hiveconf a=b -e 'set a; sethiveconf:a;create table if not exists b (col int); describe ${hiveconf:a}'
命令可以分解为以下步骤:
- --hiveconf a=b 设置在Hive命令中使用变量替换:a=b
- Set a; 定义在Hive CLI中的hiveconf变量a
- create table… 创建一个名称为b的Hive数据表
- describe ${hiveconf:a} 使用变量替换,通过a引用b的值,显示b的表结构
上面命令的执行结果为:
Hive historyfile=/tmp/edward/hive_job_log_edward_201011240906_1463048967.txt
a=b
hiveconf:a=b
OK
Time taken: 5.913 seconds
OK
int
Time taken: 0.754 seconds
hiveconf选项从Hive0.7.0开始加入进来,在Hive0.8.0增加了define和hivevar选项,在Hive0.9.0中三者的含义没有发生变化,在此不做赘述。
二、使用变量
变量分属于三个命名空间:hiveconf, system, and env,或者说变量根据所属的命名空间分为三种类型。创建与使用变量替换可以通过Hive -e命令实现,也可以在Hive CLI中实现,创建与引用的hiveconf变量的方法如下:
set x=myvalue --创建hiveconf变量,并赋值myvalue,myvalue可能是常量也可能是一个变量
${hiveconf:x} --引用hiveconf变量x
下面是一些使用变量替换的示例,它们必须在Hive CLI中执行(来自脚本:ql/src/test/queries/clientpositive/set_processor_namespaces.q):
set zzz=5; --定义hiveconf变量zzz并且赋初值5
set zzz; --输出zzz的值
set system:xxx=5; --定义system变量xxx并赋初值5
set system:xxx; --输出xxx的值
set system:yyy=${system:xxx}; --定义system变量yyy,并把xxx的值赋作初值
set system:yyy; --输出yyy的值
set go=${hiveconf:zzz}; --定义hiveconf变量go,并且把同类型的变量zzz的值赋作初值
set go; --输出go的值
set hive.variable.substitute=false; --禁用Hive的变量替换功能
set raw=${hiveconf:zzz}; --定义hiveconf变量raw,并且把同类型的变量zzz的值赋作初值
set raw; --输出raw的值,会发现zzz的值根本无法赋给raw
set hive.variable.substitute=true; --启用Hive的变量替换功能
EXPLAIN SELECT * FROM src wherekey=${hiveconf:zzz}; --hiveconf变量zzz用在查询语句中
SELECT * FROM src wherekey=${hiveconf:zzz};
set a=1;
set b=a;
set c=${hiveconf:${hiveconf:b}}; --变量替换的嵌套使用
set c;
set jar=../lib/derby.jar;
add file ${hiveconf:jar}; --使用变量替换添加资源文件
list file;
delete file ${hiveconf:jar}; --使用变量替换删除资源文件
list file;
三、变量替换的禁用与启用
默认情况下,Hive的变量替换是启用的,如果要禁用变量替换,在Hive的CLI下,输入如下命令:
set hive.variable.substitute=false;
如果想重新启用变量替换,则输入如下命令:
sethive.variable.substitute=true;