In hive, How to Convert column to row

Viewed 157

in hive, how to convert columns to row??

for example

(As - is)

index name sku1_nm sku1_cnt sku2_cnt sku2_cnt sku3_nm sku3_cnt
1 dgpark box 3 drink 2 choco 3

(To - be)

index name sku_nm sku_cnt
1 dgpark box 3
1 dgpark drink 2
1 dgpark choco 3
2 Answers

Use union all + aggregation:

with mytable as(--demo dataset. Use your table instead
select                              
1 index, 'dgpark' name, 'box' sku1_nm,  3 sku1_cnt, 'drink' sku2_nm, 2 sku2_cnt, 'choco' sku3_nm, 3 sku3_cnt
)

select index, name, sku_nm, sum(sku_cnt) sku_cnt
from
(
select index, name, sku1_nm as sku_nm, sku1_cnt as sku_cnt from mytable union all
select index, name, sku2_nm as sku_nm, sku2_cnt as sku_cnt from mytable union all
select index, name, sku3_nm as sku_nm, sku3_cnt as sku_cnt from mytable
) u
group by index, name, sku_nm;

Result:

index   name    sku_nm  sku_cnt
1       dgpark  box     3
1       dgpark  choco   3
1       dgpark  drink   2

Use explode function.

select
    a.index, a.name, split(sku, '-')[0] as sku_nm, split(sku, '-')[0] as sku_cnt
from
(
    select index, name, 
        concat_ws(',', concat(sku1_nm, '-', sku1_cnt), concat(sku2_nm, '-', sku1_cnt), concat(sku3_nm, '-', sku3_cnt)) as skus
    from temp
) a
lateral view explode(split(attr,',')) b as sku
Related