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

How to display all the fields in a complex data column (map type) in Impala?

我在 Impala 中有一个数据table,它有一个结构复杂的列:键和值。我想在每一行中显示该列的整个字段:当我 SELECT 数据时,每行的键和值。

想要table:

Id,             map_tag
100, {building:yes, type:apartment, street:street_a, number:3} 
101, {building:yes, type:hotel}
102, {building:yes, 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 字段的语法。所以 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 字段时,如果您确实为其分配了别名,则应为“主要”table 使用别名。 IE。在上面的例子中,内部 SELECT 使用 datatable dt 所以对 complex_column 的引用应该看起来像 dt.complex_column (不是 actual_table.column_name 这将是“正常的”)。