在变量中存储查询结果

8

我有一个查询,想将结果存储在一个变量中。我应该怎么做?我尝试过

./hive -e  "use telecom;insert overwrite local directory '/tmp/result' select
avg(a) from abc;"

./hive --hiveconf MY_VAR =`cat /tmp/result/000000_0`;

我可以在MY_VAR中获取平均值,但这只限于hive CLI,这是不必要的。是否有一种方法在hive CLI内部访问unix命令?

6个回答

15
用例: 在mysql中以下语句是有效的:

set @max_date := select max(date) from some_table;
select * from some_other_table where date > @max_date;

这对于需要重复调用此变量的脚本非常有用,因为您只需要执行一次最大日期查询,而不是每次调用变量时都需要执行。

HIVE目前不支持此功能。(如果我错了,请纠正我!我一直在试图找出如何做到这一点)

我的解决方法是将所需变量存储在一个小表中,该表足够小以映射连接到使用它的查询。因为连接是一个映射连接而不是广播连接,所以不应对性能产生重大影响。例如:

drop table if exists var_table;

create table var_table as
select max(date) as max_date from some_table;

select some_other_table.*
from some_other_table
left join var_table
where some_other_table.date > var_table.max_date;

@visakh提出的建议解决方案并不理想,因为其存储字符串'select count(1) from table_name;'而不是返回值,因此在脚本中需要重复调用变量的情况下将不会有帮助。


在变量名称前面是否需要使用@符号?或者@是变量名称的一部分吗?变量名称应该以@符号开头吗? - shrewquest
如果存在表temp_key,则删除该表;创建表temp_key,作为选择refined.transactions表的最大值id的结果;选择(row_number() OVER ())+tk.id作为newid和t2.*; 从raw.transactions表中获取数据,并与temp_key表进行关联,连接条件为1=1。 - Sean Anderson

7

将Hive查询的输出存储到一个变量中并在另一个查询中使用。

在Shell中,通过以下方式创建所需值的变量:

var=`hive -S -e "select max(datekey) from ....;"`
echo $var

通过以下方式在另一个Hive查询中使用变量值:

hive -hiveconf MID_DATE=$var -f test.hql

2
你可以使用一个shell脚本来轻松实现这个操作。
创建一个名为avg_op.sh的shell脚本文件。
#!/bin/sh
hive -e 'use telecom;select avg(a) from abc;' > avg.txt
wait
value=`cat avg.txt`
hive --hiveconf avgval=$value -e "set avgval;set hiveconf:avgval;
use telecom;
select * from abc2 where avg_var=\${hiveconf:avgval};"

执行 .sh 文件

>bash avg_op.sh

2

如果你想在Linux中从Hive查询或impala查询中捕获数字,可以通过执行查询并从正则表达式中选择数字来实现。

对于Hive:

最初的回答:

在Linux中,如果您想从Hive查询或Impala查询中获取数字,可以通过执行查询并从正则表达式中选择数字来实现。

max=`beeline -u ${hiveConnectionUrl} -e "select max(col1) from schema_name.table_name;" | sed 's/[^0-9]*//g'`

最重要的部分是从结果中提取数字。如果结果太大,您可以使用--silent=true标志来静默执行,这将减少日志消息。

1

请尝试以下命令:

$ var=$(hive -e "select '12' ")

$ echo $var

输出结果为:12


1
你可以使用BeeTamer来实现。它允许将结果(或其中的一部分)存储在变量中,并在代码中稍后使用该变量。
BeeTamer是一种宏语言/宏处理器,可以扩展Apache Hive和Cloudera Impala引擎的功能。
select avg(a) from abc;
%capture MY_AVERAGE;
select * from abc2 where avg_var=#MY_AVERAGE#;

在这里,您将查询的平均值保存到宏变量MY_AVERAGE中,然后在第二个查询中重复使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接