在Hive中转置许多列

时间:2015-12-14 11:19:13

标签: sql hadoop hive transpose

全部, 关于转置有很多问题,但找不到最佳解决方案。所以发布另一个转置问题

我的数据是这种格式

> Customer| Status_A|Status_B|Status_C  
> 111|New | Null|New   
> 222|Old | Old |New   
> 333|Null| New |New 

我想要这种格式的结果

>Customer   Parameter   Status  
>111    A   New  
>111    B   Null  
>111    C   New  
>222    A   Old  
>222    B   Old  
>222    C   New  
>333    A   Null   
>333    B   New   
>333    C   New  

注意 - 1)我有50列像这样 2)我真的不需要在结果数据中使用null的行

寻找最有效的解决方案。谢谢

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用巨型union all

select customer, 'A' as parameter, status_a as status from t where status_a is not null union all
select customer, 'B' as parameter, status_b from t where status_b is not null union all
. . .

这可能很难打字,因此我建议您在电子表格中生成代码或使用其他SQL查询。

以上要求每列扫描一次表。有时,更快的方法使用cross join

select t.customer, p.parameter,
       (case p.parameter
            where 'a' then status_a
            where 'b' then status_b
            . . .
        end) as status
from t cross join
     (select 'a' as parameter union all
      select 'b' union all
      . . .
     ) p;

要消除NULL s,请将其设为子查询并使用where status is not NULL