hadoop - Hive:在Hive SQL中转置的方法

标签 hadoop hive hiveql transpose

我正在尝试在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;

关于hadoop - Hive:在Hive SQL中转置的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60795214/

相关文章:

java - 无法通过 jdbc 连接到配置单元

sql - 您如何在 HiveQL 中获取“事件日期 > 当前日期 - 10 天)?

hive - 在 Hive collect 中保持记录的顺序

sql - 如何获取配置单元中仅具有 NULL 值的所有列的列表?

java - Java Runtime Environment内存不足,无法继续hbase

hadoop - 如何在Mac OS X上编译和设置Sizzle(Sawle是Hadoop的开源Sawzall实现)?

sql - 比较两个配置单元表之间的计数

hive - 如何删除外部 hive 表和数据

hadoop - 如何正确删除 Hadoop 中的节点?

hadoop - Hive:合并配置设置不起作用