在配置单元查询(hql)中将字符串数组作为参数传递

insrf1ej  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(378)

我正在研究hql,在这里我需要传递一个字符串数组作为参数:

select * from table_1 where id not in ('${idListToFilter}')

我想通过 idListToFilter 作为配置单元查询中的参数。尝试使用如下值

idListToFilter="'1','2','3'"

但有个例外:
noviablealtexception(340@[319:1:常量:((intervalliteral)=>intervalliteral | number | dateliteral | timestampliteral | stringliteralsequence | integralliteral | numberliteral | charsetstringliteral | booleanvalue | kw|null->tok|null);])
有人能帮忙吗?

hl0ma9xz

hl0ma9xz1#

in子句需要列表或列,而不是逗号分隔的字符串。做你想做的事的一个方法就是 split 以及 explode 像这样的字符串:

WITH values AS (
  select explode(split('${hivevar:idListToFilter}',',')) val
)
SELECT * FROM table_1 t
WHERE t.id NOT IN (
  SELECT trim(x.val) from values x
);

... 哪里 idListFilter 作为简单的逗号分隔字符串通过

$ beeline --hivevar idListToFilter="id1,id2,id3" ...
vbopmzt1

vbopmzt12#

你可以从直线上试试这个:
我的sql.sql

select '${hivevar:my_val}';

直线命令

beeline -u jdbc:hive2://localhost:10000 --hivevar my_val=ARRAY['1','2','3'] -f my_sql.sql

输出

+---------------+--+
|      _c0      |
+---------------+--+
| ARRAY[1,2,3]  |
+---------------+--+

或者传递带有逗号分隔值的字符串,然后拆分数组
我的文件.sql

select SPLIT('${hivevar:my_val}',',');

直线命令

beeline -u jdbc:hive2://localhost:10000 --hivevar my_val="rojo, amarillo, azul" -f my_sql.sql

输出

+-------------------------------+--+
|              _c0              |
+-------------------------------+--+
| ["rojo"," amarillo"," azul"]  |
+-------------------------------+--+

相关问题