首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在配置单元脚本中设置变量

如何在配置单元脚本中设置变量
EN

Stack Overflow用户
提问于 2012-09-18 01:51:52
回答 10查看 228.4K关注 0票数 108

我正在寻找与Hive QL中的SET varname = value等价的SQL

我知道我可以这样做:

代码语言:javascript
复制
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE

但是我得到了这个错误:

此处不支持

字符'@‘

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-09-19 06:03:30

您需要使用特殊的hiveconf进行变量替换。例如:

代码语言:javascript
复制
hive> set CURRENT_DATE='2012-09-16';
hive> select * from foo where day >= ${hiveconf:CURRENT_DATE}

同样,您可以在命令行上传递:

代码语言:javascript
复制
% hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql

注意,还有环境系统变量,因此您可以引用${env:USER}作为示例。

要查看所有可用变量,请在命令行中运行

代码语言:javascript
复制
% hive -e 'set;'

或者在配置单元提示符下运行

代码语言:javascript
复制
hive> set;

更新:我也开始使用hivevar变量,将它们放入hql代码段中,我可以使用source命令(或从命令行作为-i选项传递)从hive CLI包含它们。这里的好处是,变量可以与hivevar前缀一起使用,也可以不与hivevar前缀一起使用,并允许类似于全局与本地使用。

因此,假设有一些setup.hql设置了一个tablename变量:

代码语言:javascript
复制
set hivevar:tablename=mytable;

然后,我可以将其带入蜂巢:

代码语言:javascript
复制
hive> source /path/to/setup.hql;

并在查询中使用:

代码语言:javascript
复制
hive> select * from ${tablename}

代码语言:javascript
复制
hive> select * from ${hivevar:tablename}

我还可以设置一个"local“表名,这会影响${ tablename }的使用,但不会影响${hivevar:tablename}

代码语言:javascript
复制
hive> set tablename=newtable;
hive> select * from ${tablename} -- uses 'newtable'

vs

代码语言:javascript
复制
hive> select * from ${hivevar:tablename} -- still uses the original 'mytable'

从CLI中可能没有太多意义,但可以在使用source的文件中使用hql,但将一些变量设置为“本地”,以便在脚本的其余部分使用。

票数 214
EN

Stack Overflow用户

发布于 2019-01-04 10:26:29

这里的大多数答案都建议使用hiveconfhivevar名称空间来存储变量。所有这些答案都是正确的。但是,还有一个名称空间。

总共有三种 namespaces 可用于保存变量。

  1. hiveconf - hive从这个开始,所有的hive配置都被存储为这个会议的一部分。最初,变量替换不是hive的一部分,当它被引入时,所有用户定义的变量也被存储为其中的一部分。这绝对不是个好主意。因此,又创建了两个名称空间。用于存储用户variables
  2. system:的
  3. hivevar:用于存储系统变量。

因此,如果您将变量存储为查询的一部分(即date或product_number),则应该使用hivevar名称空间,而不是hiveconf名称空间。

,这是它的工作原理。

hiveconf 仍然是默认的名称空间,所以如果您不提供任何名称空间,它会将您的变量存储在hiveconf名称空间中。

然而,当涉及到引用变量时,情况就不是这样了。默认情况下,它指的是hivevar名称空间。很迷惑,对吧?通过下面的示例,它可以变得更加清晰。

如果您不提供如下所述的命名空间,变量var将存储在hiveconf命名空间中。

代码语言:javascript
复制
set var="default_namespace";

因此,要访问此名称空间,您需要指定 hiveconf名称空间

代码语言:javascript
复制
select ${hiveconf:var};

如果你没有提供命名空间,它会给你一个错误,如下所述,原因是在默认情况下,如果你试图访问一个变量,它只在hivevar命名空间中检查。并且在hivevar中没有名为var的变量

代码语言:javascript
复制
select ${var}; 

我们显式地提供了hivevar命名空间

代码语言:javascript
复制
set hivevar:var="hivevar_namespace";

因为我们提供了命名空间,所以这将会起作用。

代码语言:javascript
复制
select ${hivevar:var}; 

默认情况下,引用变量时使用的工作区是hivevar,下面的代码也可以。

代码语言:javascript
复制
select ${var};
票数 28
EN

Stack Overflow用户

发布于 2012-09-18 02:41:11

您是否尝试过像这样使用美元符号括号

代码语言:javascript
复制
SELECT * 
FROM foo 
WHERE day >= '${CURRENT_DATE}';
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12464636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档