繁体   English   中英

Hive:在 Hive sql 中转置的方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM