在 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 子句需要一个列表或一列,而不是逗号分隔的字符串。
做你想做的事情的一种方法是 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
通过
作为简单的逗号分隔字符串传递到 HQL
$ beeline --hivevar idListToFilter="id1,id2,id3" ...
我正在处理 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 子句需要一个列表或一列,而不是逗号分隔的字符串。
做你想做的事情的一种方法是 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" ...