【问题标题】:Storing query result in a variable将查询结果存储在变量中
【发布时间】:2019-08-28 00:25:07
【问题描述】:

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

./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 命令?

【问题讨论】:

    标签: variables hadoop hive


    【解决方案1】:

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

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

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

    HIVE 目前不支持这个。(如果我错了,请纠正我!我整个下午都在想办法做到这一点)

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

    如果存在则删除表 var_table;

    创建表 var_table 为
    从 some_table 中选择 max(date) 作为 max_date;

    选择 some_other_table。*
    来自 some_other_table
    左连接 var_table
    其中 some_other_table.date > var_table.max_date;

    @visakh 建议的解决方案不是最优的,因为存储了字符串 'select count(1) from table_name;'而不是返回值,因此在您需要在脚本期间重复调用 var 的情况下将无济于事。

    【讨论】:

    • 变量名前一定要@吗?还是 @ 是变量名的一部分?变量名应该以@开头吗?
    • 删除表如果存在 temp_key; CREATE TABLE temp_key AS SELECT max(t.id) AS id FROM refine.transactions AS t; SELECT (row_number() OVER ())+tk.id as newid, t2.* FROM raw.transactions AS t2 JOIN temp_key as tk ON 1=1;
    【解决方案2】:

    将 hive 查询输出存储在一个变量中并在另一个查询中使用它。

    在 shell 中通过执行以下操作创建具有所需值的变量:

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

    在另一个 hive 查询中使用变量值:

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

    【讨论】:

      【解决方案3】:

      您可以使用 shell 脚本简单地实现这一点。

      创建一个shell脚本 文件: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】:

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

        使用 Hive,

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

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

        【讨论】:

          【解决方案5】:

          您可以为此使用BeeTamer。它允许将结果(或部分结果)存储在一个变量中,稍后在您的代码中使用这个变量。

          Beetamer 是一种宏语言/宏处理器,允许扩展 Apache Hive 和 Cloudera Impala 引擎的功能。

          select avg(a) from abc;
          %capture MY_AVERAGE;
          select * from abc2 where avg_var=#MY_AVERAGE#;
          

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

          【讨论】:

            【解决方案6】:

            试试下面:

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

            $ 回声 $var

            12 -- 输出

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-12-29
              • 1970-01-01
              • 2012-03-13
              • 1970-01-01
              • 1970-01-01
              • 2012-09-01
              • 2021-03-01
              • 2022-01-25
              相关资源
              最近更新 更多