HiveQL:将查询结果用作变量

时间:2016-05-13 09:36:43

标签: hive hiveql

Hive中的

我想从表中动态提取信息,将其保存在变量中并进一步使用它。请考虑以下示例,其中我检索列var的最大值,并希望将其用作后续查询中的条件。

set maximo=select max(var) from table;

select
  *
from
  table
where
  var=${hiveconf:maximo}

虽然

,但不起作用
set maximo=select max(var) from table;

${hiveconf:maximo}

向我展示了预期的结果。

这样做的:

select '${hiveconf:maximo}'

给出

"select max(var) from table"

虽然。

最佳

2 个答案:

答案 0 :(得分:7)

Hive按原样替换变量,但不执行它们。使用shell包装器脚本将结果转换为变量并将其传递给Hive脚本。

maximo=$(hive -e "set hive.cli.print.header=false; select max(var) from table;")
hive -hiveconf "maximo"="$maximo" -f your_hive_script.hql

在您的脚本中,您可以使用select '${hiveconf:maximo}'

答案 1 :(得分:1)

@Hein du Plessis

虽然不可能从 Hue 中完全按照您的意愿去做——这对我来说是一个持续的挫折来源——如果您仅限于 Hue,并且不能按照上面的建议使用 shell 包装器,但有一些解决方法取决于场景。

当我曾经想通过选择要在查询中使用的表中列的最大值来设置变量时,我是这样解决的:

我首先将结果放入一个包含两列的表中,其中一列是(任意字)'MAX_KEY',另一列是最大值计算的结果,如下所示:

drop table if exists tam_seg.tbl_stg_temp_max_id;
create table tam_seg.tbl_stg_temp_max_id as
select
    'MAX_KEY' as max_key
    , max(pvw_id) as max_id
from
    tam_seg.tbl_dim_cc_phone_vs_web;

然后我将单词“MAX_KEY”添加到子查询中,然后加入上表,以便我可以在主查询中使用结果:

select
    -- *** here is the joined in value from the table being used ***
    cast(mxi.max_id + qry.temp_id as string) as pvw_id
    , qry.cc_phone_vs_web
from
    (
    select
        snp.cc_phone_vs_web
        , row_number() over(order by snp.cc_phone_vs_web) as temp_id
        -- *** here is the key being added to the sub-query ***
        , 'MAX_KEY' as max_key
    from
        (
        select distinct cc_phone_vs_web from tam_seg.tbl_stg_base_snapshots
        ) as snp
    left outer join
        tam_seg.tbl_dim_cc_phone_vs_web as pvw
        on snp.cc_phone_vs_web = pvw.cc_phone_vs_web
    where
        pvw.cc_phone_vs_web is null
    ) as qry
-- *** here is the table with the select result in being joined in ***
left outer join
    tam_seg.tbl_stg_temp_max_id as mxi
    on qry.max_key = mxi.max_key
;

不确定这是否是您的场景,但也许可以调整。不过,我 99% 确定您不能将 select 语句直接放入 Hue 中的变量中。

如果我只用 Hue 做某事,我可能会使用临时表和连接方法。但是,如果我无论如何都使用了shall 包装器,我肯定会在那里使用它。

我希望这会有所帮助。