gpt4 book ai didi

java - Hive:如何使用映射列分解表

转载 作者:行者123 更新时间:2023-11-30 10:05:58 25 4
gpt4 key购买 nike

我有一张这样的 table

+-----+------------------------------+
| id | mapCol |
+-----+------------------------------+
| id1 | {key1:val1, key2:val2} |
| id2 | {key1:val3, key2:val4} |
+-----+------------------------------+

所以我可以很容易地执行像

这样的查询

从 myTab where id='id1' 中选择 explode(mapCol) as (key, val)

我明白了

+--------+-----+
| key | val |
+--------+-----+
| key1 | val1|
| key2 | val2|
+--------+-----+

我想生成这样的表格

+-----+------+-----+
|id | key | val |
+-----+------+-----+
| id1 | key1 | val1|
| id1 | key2 | val2|
| id2 | key1 | val3|
| id2 | key2 | val4|
+-----+------------+

请注意,我想显示 id 以及展开的行。此外,对于多个 id,key 可能会重复,因此我希望行能够反射(reflect)这一点。基本上,id + key 应该是唯一的。

我将如何为此编写查询?我试过了

从 myTab 中选择 explode(mapCol) as (key, val), id

但是我得到了

失败:SemanticException 1:66 UDTF 仅支持 SELECT 子句中的单个表达式

最佳答案

使用lateral view :

with MyTable as -------use your table instead of this subquery
(select id, str_to_map(mapStr) mapCol
from
(
select stack(2,
'id1','key1:val1,key2:val2',
'id2','key1:val3,key2:val4'
) as (id, mapStr))s
) -------use your table instead of this subquery

select t.id, s.key, s.val
from MyTable t
lateral view outer explode(mapCol) s as key, val;

结果:

OK
id1 key1 val1
id1 key2 val2
id2 key1 val3
id2 key2 val4
Time taken: 0.072 seconds, Fetched: 4 row(s)

使用您的表而不是 MyTable 子查询。

另请阅读有关侧 View 的答案:https://stackoverflow.com/a/51846380/2700344 .

关于java - Hive:如何使用映射列分解表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54953074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com