Как использовать подстановку вложенных переменных в запросе куста

Я пытался использовать вложенные переменные непосредственно в запросе куста. Я использую Hive и Dbeaver.

Моя цель - просмотреть список условий и сохранить результаты в пронумерованных таблицах (condition_1 | tbl_1, condition_2, tbl_2 и т. д.). Вот пример:

@set condition_1 = col1 in (1,10,11) and col2 in (1000,10000)
@set condition_2 = col1 in (2,20,22) and col2 in (2000,20000)
@Set ctrl= 1

create table tbl_${ctrl}
select ${ctrl} as id, * from my_table where ${condition_${ctrl}}

Когда я запускаю оператор select, он терпит неудачу в операторе where и разрешает только переменную ctrl, и я получаю это сообщение об ошибке:

SQL Error [40000] [42000]: Error while compiling statement: FAILED: ParseException line 22:6 cannot recognize input near '$' '{' 'condition_1' in expression specification

Я думаю, что куст игнорирует последнюю закрывающую фигурную скобку. Любая помощь будет оценена по достоинству!

Я прочитал Подстановка переменных вручную, но это показывает только это:

set a=1;
set b=a;
set c=${hiveconf:${hiveconf:b}};
set c;
--uses nested variables.

person arnaldoleandro    schedule 08.03.2021    source источник


Ответы (1)


Я думаю, что куст игнорирует последнюю закрывающую фигурную скобку.

Потому что перед фигурной скобкой нужно поставить знак доллара.

Делай как в мануале и все заработает. Укажите пространство имен hiveconf и не забудьте про знак доллара перед фигурной скобкой: ${hiveconf:condition_${hiveconf:ctrl}}

Этот пример отлично работает:

set condition_1 = col1 in (1,10,11) and col2 in (1000,10000);
set condition_2 = col1 in (2,20,22) and col2 in (2000,20000);
Set ctrl= 1;

with Table1 as( 
SELECT stack (2,
1, 1000,
2, 2000
) AS  (col1, col2)
)

select ${hiveconf:ctrl} as id, t.* from Table1 t where ${hiveconf:condition_${hiveconf:ctrl}}
person leftjoin    schedule 09.03.2021
comment
Привет! Спасибо за ваш ответ. В моем сценарии я правильно использовал скобки. Я просто неправильно набрал код в своем вопросе. - person arnaldoleandro; 09.03.2021
comment
Я попытался запустить ваш фрагмент кода, и это не сработало. Я использую Dbeaver для запуска. Вот скриншот: snipboard.io/EMU3q8.jpg В первом СС я пытался запустить именно как вы написали. 2-й снимок экрана: snipboard.io/T1xksP.jpg Итак, я попытался бежать так же, как и раньше. перед (@set) и показывает всплывающее окно Это всплывающее окно обычно появляется, когда я пытаюсь запустить переменную без предварительного объявления. - person arnaldoleandro; 09.03.2021
comment
@arnaldoleandro Да, в Dbeaver это может работать по-другому, я не уверен насчет Dbeaver. В чистом Hive это работает, и вам не нужен @set. - person leftjoin; 09.03.2021
comment
Да. В чистом улье это работало. Но мне нужно, чтобы мои скрипты запускались в Dbeaver, к сожалению. - person arnaldoleandro; 09.03.2021