在书写 Hive SQL 时,有时需要将重复出现的值从 SQL 分离出来,以变量的方式表示和引用。
设置变量和引用变量可以带来以下几个好处:
总之,自定义变量和引用变量是一种良好的编程习惯,可以使查询语句更加简洁、易读、易于维护和重用,并提高查询语句的灵活性和可配置性。
Hive 变量有四个命名空间 —— hiveconf、system、 env 和 hivevar。
命名空间 | 权限 | 描述 |
---|---|---|
hiveconf | 读写 | Hive 相关配置属性 |
system | 读写 | Java 定义的配置属性 |
env | 只读 | Shell 环境定义的环境变量 |
hivevar | 读写 | 用户自定义临时变量(Hive v0.8.0 及之后版本) |
(1)查看所有变量。
SET;
-- 加上 -v 可以查看 HDFS 和 MapReduce 的环境变量信息
SET -v;
(2)查看指定变量。
SET varname;
-- 查看自定义变量
-- 名字空间 hivevar 可加可不加
SET myvar;
SET hivevar:myvar;
-- 查看 Hive 配置参数:用于限制每个节点上允许创建的动态分区的数量
-- 名字空间 hiveconf 可加可不加
SET hive.exec.max.dynamic.partitions.pernode;
SET hiveconf:hive.exec.max.dynamic.partitions.pernode;
-- 查看 system 变量,必须指定名字空间
SET sytem:user.name;
-- 结果示例
sytem:user.name=hadoop
-- 查看 env 变量,必须指定名字空间
SET env:HADOOP_HOME
-- 结果示例
env:HADOOP_HOME=/usr/local/service/hadoop
设置变量时,如果不指定命名空间,缺省为 hiveconf。
(1)修改 Hive 配置参数。
-- 名字空间 hiveconf 可加可不加
SET hive.exec.max.dynamic.partitions.pernode=1000;
SET hiveconf:hive.exec.max.dynamic.partitions.pernode=1000;
(2)自定义变量。
Hive 中的自定义变量是会话级别的,即它们在会话结束后会被重置。
-- 必须加上 hivevar
SET hivevar:myvar='hello';
(1)SQL 中引用自定义变量。
-- 可加可不加名字空间 hivevar
SELECT ${myvar};
SELECT ${hivevar:myvar};
SQL 中引用其他名字空间下的变量,好像会报错,比如 env 下的 Shell 环境变量,感兴趣的同学可以试一下。