在impala中,是否可以将Map中的Map键投影为结果集中的实际列?我正在接收一个数据集,其中我们无法提前知道所有可能的属性,因此我们使用map列来获得最大的灵活性。但是,在查询时,我们仍然希望将这些属性作为它们自己的列拉出。
下面的简化示例有几个唯一的键(实际上,我们的数据集中有数百个键)
架构:
Column | Type
-------------------
name | STRING
props | MAP<string, string>
原始表:
Name | Props
-----------------
Bob | {"age": "39", "fav_color": "green"}
Alice | {"fav_animal": "dog", "fav_color": "blue"}
期望结果:
name | age | fav_color | fav_animal
----------------------------------------------
Bob | 39 | green | NULL
Alice | NULL | blue | dog
我可以通过以下方式以行为导向获得所有结果
选择name,props.key,props.value from table,table.props props;
但是,我还没有弄清楚如何将这些键从map type列变成它们自己的列。在 Impala 有没有有效的方法?
(我很乐意编写一个自定义的udf,但是impala udf不能接受像map这样的复杂类型:(很遗憾)
2条答案
按热度按时间xwmevbvl1#
找到了一个潜在的解决方案,但是对于大量的属性来说它是非常缓慢和麻烦的。下面的查询将两个属性提取到单独的列中。
如果可能的话,更愿意找到一个更有效、更简单的解决方案。
sirbozc52#
我可以使用impala(cdh5.13)中的struct数据类型来实现这一点。下面是我遵循的一系列步骤。注意,impala只支持parquet格式的struct数据类型。因此,我使用hive创建表并将数据加载到其中,然后使用impala查询相同的表。
Hive
首先创建一个基于文本文件的暂存表,将csv加载到暂存表中,然后使用“insert into”将表加载到parquet表中。一旦数据加载到所需的表中,在impala中使用下面的查询:
希望这有帮助。