在 Hive Query (HQL) 中将字符串数组作为参数传递

Passing array of string as an argument in Hive Query (HQL)

我正在处理 HQL,我需要将字符串数组作为参数传递:

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

我想将 idListToFilter 作为参数传递给 Hive 查询。尝试使用像

这样的值
idListToFilter="'1','2','3'"

但出现异常:

NoViableAltException(340@[319:1: constant : ( ( intervalLiteral )=> intervalLiteral | Number | dateLiteral | timestampLiteral | StringLiteral | stringLiteralSequence | IntegralLiteral | NumberLiteral | charSetStringLiteral | booleanValue | KW_NULL -> TOK_NULL );])

有人可以帮忙吗?

你可以从直线上试试这个:

my_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]  |
+---------------+--+

或者传递一个以逗号分隔值的字符串,然后拆分数组

my_file.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"]  |
+-------------------------------+--+

IN 子句需要一个列表或一列,而不是逗号分隔的字符串。 做你想做的事情的一种方法是 splitexplode 一个字符串,像这样:

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 通过

作为简单的逗号分隔字符串传递到 HQL
$ beeline --hivevar idListToFilter="id1,id2,id3" ...