如何在Impala中显示复杂数据列地图类型中的所有字段?

问题描述

我在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。这里是它的截图:

enter image description here

解决方法

根据Impala Complex Types文档,“对MAP列中字段的引用使用KEY和VALUE伪列” 。该文档还提供了查询MAP字段的语法。因此,SELECTGROUP_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, “正常”)。