如何在 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 字段的语法。所以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 字段时,如果您确实为“主”表分配了别名,则应使用别名。 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 查询的方式在包含复杂类型的配置单元表上创建日期限制视图?

如何引用列中的第一个非空字符串 - Cloudera Impala / Apache Hive / Spark SQL

在镶木地板的地图类型列上使用 spark-sql 过滤下推