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 ответа

Решение

Hive заменяет переменные как есть и не выполняет их. Используйте скрипт оболочки оболочки, чтобы получить результат в переменную и передать его в свой скрипт 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}'

Хотя невозможно сделать именно то, что вы хотите от Hue - постоянный источник разочарования для меня - если вы ограничены Hue и не можете использовать оболочку оболочки, как предложено выше, есть обходные пути в зависимости от сценария.

Когда однажды я захотел установить переменную, выбрав максимальное значение столбца в таблице для использования в запросе, я обошел это так:

Сначала я помещаю результат в таблицу, состоящую из двух столбцов, с (произвольным словом) '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, я бы, вероятно, сделал временную таблицу и метод соединения. Но если бы я все равно использовал обертку, я бы определенно сделал это там.

Другие вопросы по тегам