我有一个程序将类似('A','B')
的字符串注入查询中。如何将其转换为像这样的数组横向视图
col
---
A
B
Impala vs. Hive中没有explode(array('A','B'))
功能。我无法将这些值存储在表中,因为它存储在内存中并动态注入SQL。
我需要这个的原因是我有另一个表来加入数组中的项目。
由于
答案 0 :(得分:1)
Impala只允许选择基本类型作为select语句的一部分,以爆炸你的数组(我猜你的表只有一个名为myarray的列)你将需要做这样的事情。
演示: 在Hive中
create table test_array (myarray array<string>) stored as parquet ;
-- tricky way to insert values for array
insert into test_array select array('a','b') from (select '1') t;
insert into test_array select array('c','d') from (select '1') t;
帕拉
select myarray.item from test_array, test_array.myarray ;
结果
+------+
| item |
+------+
| a |
| b |
| c |
| d |
+------+
默认情况下,impala使用名称“item”来访问基本数组的元素。对于结构数组,您需要更改要访问的字段的“item”。
如果我们添加一个空数组
,这是一件有趣的事情 insert into test_array select array() from (select '1') t;
如果我们运行相同的查询,您将看不到空数组作为结果的一部分,这是因为它基本上就像您的记录和数组之间的内部联接,不包括空值。如果要包含具有空数组信息的记录,查询将类似于
select myarray.item from test_array LEFT OUTER JOIN test_array.myarray ;
+------+
| item |
+------+
| c |
| d |
| a |
| b |
| NULL |
+------+
(您可以找到有关不同联接here
的更多信息