【问题标题】:In hive, How to Convert column to row在 hive 中,如何将列转换为行
【发布时间】: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

【问题讨论】:

    标签: sql hive hiveql unpivot


    【解决方案1】:

    使用爆炸功能。

    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
    

    【讨论】:

      【解决方案2】:

      使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 2019-11-10
        • 2021-11-27
        • 2012-12-26
        相关资源
        最近更新 更多