【发布时间】:2021-12-19 06:24:23
【问题描述】:
在hive中,如何将列转换为行??
例如
(原样)
| index | name | sku1_nm | sku1_cnt | sku2_cnt | sku2_cnt | sku3_nm | sku3_cnt |
|---|---|---|---|---|---|---|---|
| 1 | dgpark | box | 3 | drink | 2 | choco | 3 |
(未来)
| index | name | sku_nm | sku_cnt |
|---|---|---|---|
| 1 | dgpark | box | 3 |
| 1 | dgpark | drink | 2 |
| 1 | dgpark | choco | 3 |
【问题讨论】:
在hive中,如何将列转换为行??
例如
(原样)
| index | name | sku1_nm | sku1_cnt | sku2_cnt | sku2_cnt | sku3_nm | sku3_cnt |
|---|---|---|---|---|---|---|---|
| 1 | dgpark | box | 3 | drink | 2 | choco | 3 |
(未来)
| index | name | sku_nm | sku_cnt |
|---|---|---|---|
| 1 | dgpark | box | 3 |
| 1 | dgpark | drink | 2 |
| 1 | dgpark | choco | 3 |
【问题讨论】:
使用爆炸功能。
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
【讨论】:
使用 union all + 聚合:
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;
结果:
index name sku_nm sku_cnt
1 dgpark box 3
1 dgpark choco 3
1 dgpark drink 2
【讨论】: