[英]Hive: Ways to transpose in Hive sql
我正在尝试在 Hive 中转置数据集,其结构如下:
Id1 Id2 Event
1 1 7
2 2 3
2 2 7
3 3 8
3 3 7
1 2 3
1 2 7
一些 id 组合有许多事件(接近 20 个独特的事件),我需要将它们转换为 20 列,用于 Id1 和 Id2 的每个独特组合,例如:
Id1 Id2 event1 event2 event3 event4 event5.......event20
1 1 7
2 2 3 7
3 3 8 7
1 2 3 7
如果可能的话,我还想知道如何在不使用 20 max() 函数的情况下以以下形式转置:(此处事件值将作为后缀,每次出现都将计为 1)
Id1 Id2 event_7 event_3 event_8 ........
1 1 1
2 2 1 1
3 3 1 1
1 2 1 1
非常感谢!
你可以试试这个,看看这是否有效? 我正在做的是,首先对 id1 的数据进行排名,因此对于 Id1 的重复值,排名将为 1,2。 然后使用等级并与“event_”连接以形成类似“event_1”、“event_2”等的内容。
下面有2个选项。 1) 正在使用 named_struct 2) 使用 to_map 我还没有尝试过这个,所以可能存在一些语法问题,但希望你能明白。
with data as (
select
id1, id2, event,
row_number() over (partition by id1 order by id1) as rnk
from table
),
collect_data as (
select id1, id2, collect_set(named_struct(concat("event_', rnk), event)) kv
from data
group by id1,id2
)
select id1, id2, kv[0]['event_1'], kv[0]['event_2']...
from collect_data;
或者
with data as (
select
id1, id2, event,
row_number() over (partition by id1 order by id1) as rnk
from table
),
collect_data as (
select id1, id2, to_map(concat('event_',rnk), event) as kv
from data
group by id1, id2
)
select id1, id2,
kv['c1'] AS c1,
kv['c2'] AS c2,
kv['c3'] AS c3
from collect_data;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.