问题描述
我在Impala中有一个数据表,该数据表的复杂列具有以下结构:键和值。我想在每一行中显示该列的整个字段:当我选择数据时,每一行的键和值。
所需表:
Id,map_tag
100,{building:yes,type:apartment,street:street_a,number:3}
101,type:hotel}
102,type: bank}
如果我使用:
SELECT id,GROUP_CONCAT(kv_pair) map_tag
FROM (
SELECT dt.id id,CONCAT(cc.key,':',cc.value) kv_pair
FROM datatable dt,datatable.complex_column cc
) T
GROUP BY id
然后,我得到一个唯一的ID,而不是许多ID。这里是它的截图:
解决方法
根据Impala Complex Types文档,“对MAP列中字段的引用使用KEY和VALUE伪列” 。该文档还提供了查询MAP字段的语法。因此,SELECT
和GROUP_CONCAT
的组合应该可以做到:
SELECT id,GROUP_CONCAT(kv_pair) map_tag
FROM (
SELECT dt.id id,CONCAT(cc.key,':',cc.value) kv_pair
FROM datatable dt,dt.complex_column cc
) T
GROUP BY id
Query submitted at: 2020-08-24 12:34:17 (Coordinator: https://impalac:25000)
+-----+---------------------------------------------------------+
| id | map_tag |
+-----+---------------------------------------------------------+
| 102 | building:yes,type:bank |
| 100 | building:yes,type:apartment,street:street_a,number:3 |
| 101 | building:yes,type:hotel |
+-----+---------------------------------------------------------+
Fetched 3 row(s) in 0.42s
请注意,在进行联接时引用map
字段时,如果确实为别名“ main”表分配了别名,则应使用别名。即在上面的示例中,内部SELECT
使用datatable dt
,因此对complex_column
的引用应类似于 dt.complex_column
(不是Actual_table.column_name, “正常”)。