将查询结果存储在变量中

时间:2014-06-02 07:05:00

标签: variables hadoop hive

我有一个查询,其结果我想存储在一个变量中 我该怎么做 ? 我试过了

./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 个答案:

答案 0 :(得分:13)

mysql中的

用例:以下内容有效:

  

设置@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标志来使执行静音,这将减少日志消息。

相关问题