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