如何在 Impala 中显示复杂数据列(地图类型)中的所有字段?
Posted
技术标签:
【中文标题】如何在 Impala 中显示复杂数据列(地图类型)中的所有字段?【英文标题】:How to display all the fields in a complex data column (map type) in Impala? 【发布时间】:2020-08-21 16:11:12 【问题描述】:我在 Impala 中有一个数据表,其中包含一个具有结构的复杂列:键和值。我想在每一行中显示该列的整个字段:当我选择数据时,每一行的键和值。
想要的表:
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。这是它的屏幕截图:
【问题讨论】:
【参考方案1】:根据Impala Complex Types doc,“对 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
字段时,如果您确实为“主”表分配了别名,则应使用别名。 IE。在上面的例子中,内部SELECT
使用datatable dt
,所以对complex_column
的引用应该看起来像dt.complex_column
(不是actual_table.column_name,它是“正常的”)。
【讨论】:
当我运行这个查询时,我得到了很多串联的信息,但只在一行中。所以基本上我在 map_tag 列中连接了一个 ID 和许多信息。 也许我误解了你的问题。该查询假设为每个 id 返回一个与它对应的map
的字符串表示形式。你能编辑你的帖子并添加一个有代表性的数据样本和期望的结果吗?
我已经编辑过了。提前感谢您的帮助。
我编辑了答案,如果有帮助请告诉我。
是的,这实际上是问题所在。谢谢。以上是关于如何在 Impala 中显示复杂数据列(地图类型)中的所有字段?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Impala 中插入 Array<Struct> 值?
如何在 impala 或 hive 上读取复杂类型数组<string>?
以可使用 Impala 查询的方式在包含复杂类型的配置单元表上创建日期限制视图?