我有一个查询,其结果我想存储在一个变量中 我该怎么做 ? 我试过了
./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命令?
答案 0 :(得分:13)
用例:以下内容有效:
设置@max_date:=从some_table中选择max(date);
从some_other_table中选择*,其中日期> @max_date;
这对于需要重复调用此变量的脚本非常有用,因为您只需要执行一次最大日期查询,而不是每次调用该变量。
HIVE目前不支持这一点。(如果我错了请纠正我!我整个下午一直试图弄清楚如何做到这一点)
我的解决方法是将所需变量存储在一个足够小的表中,以便将连接映射到使用它的查询。因为连接是地图而不是广播连接,所以不应该显着损害性能。例如:
drop table if var_table;
将表var_table创建为
从some_table中选择max(日期)为max_date;选择some_other_table。*
来自some_other_table
left join var_table
其中some_other_table.date> var_table.max_date;
@visakh建议的解决方案不是最佳的,因为存储字符串'select count(1)from table_name;'而不是返回的值,因此在脚本需要重复调用var的情况下不会有用。
答案 1 :(得分:6)
将hive查询输出存储在变量中并在另一个查询中使用它。
在shell中通过执行以下操作创建具有所需值的变量:
var=`hive -S -e "select max(datekey) from ....;"`
echo $var
通过以下方式在另一个配置单元查询中使用变量值:
hive -hiveconf MID_DATE=$var -f test.hql
答案 2 :(得分: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中,然后在第二个查询中重复使用它。
答案 3 :(得分:1)
您可以使用shell脚本轻松实现此目的。
创建一个shell脚本 file:avg_op.sh
#!/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
答案 4 :(得分:1)
尝试以下:
$ var = $(hive -e“ select'12'”)
$ echo $ var
12-输出
答案 5 :(得分:1)
如果您尝试从Linux中的Hive查询或impala查询中捕获数字,则可以通过执行查询并从正则表达式中选择数字来实现。
有了Hive,
max=`beeline -u ${hiveConnectionUrl} -e "select max(col1) from schema_name.table_name;" | sed 's/[^0-9]*//g'`
主要部分是从结果中提取数字。另外,如果结果太大,则可以使用--silent=true
标志来使执行静音,这将减少日志消息。