Hive: способы переноса в Hive sql - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь транспонировать набор данных в 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

В некоторых комбинациях идентификаторов есть много событий (около 20i sh уникальных событий), и мне нужно транспонировать их в 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

Большое вам спасибо!

1 Ответ

1 голос
/ 22 марта 2020

Можете ли вы попробовать это и посмотреть, работает ли это? Что я делаю, так это сначала ранжирую данные id1, чтобы ранг равнялся 1,2 для дублированных значений Id1. Затем используйте ранг и объедините с '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;
...