【问题标题】:How to convert multiple column values into rows in hive?如何将多个列值转换为配置单元中的行?
【发布时间】:2020-05-20 04:52:14
【问题描述】:
Input:

ID    COLUMN1     COLUMN2             COLUMN3
1     M,S,E,T     1,2,3,4             5,6,7
2     A,B,C       6,5,8,7,9,1         2,4,3,0,1


Output:

ID      COLUMN1      COLUMN2      COLUMN3
1        M           10           50
1        S           20           60
1        E           30           70
1        T           40           NULL
2        A           6            2
2        B           5            4
2        C           8            3 
2        NULL        7            0
2        NULL        9            1
2        NULL        1            NULL

代码:

select ID,
array_index( COLUMN1_arr, n ) as COLUMN1,
array_index( COLUMN2_arr, n ) as COLUMN2
from sample
lateral view numeric_range(size(COLUMN1_arr)) n1 as n;

错误:

失败:语义异常 [错误 10011]:无效的函数数组索引

在这里,我在单列中有多个值,我需要将其转换为提到的输出行。

【问题讨论】:

    标签: arrays hadoop hive explode


    【解决方案1】:

    普通的香草蜂巢解决方案,没有砖房 UDF。

    演示:

    with 
    
    input as ( ---------------Input dataset
    select stack(2,
    1, array('M','S','E','T'), array(1,2,3,4),     array(5,6,7),
    2, array('A','B','C'),     array(6,5,8,7,9,1), array( 2,4,3,0,1) 
    ) as (ID,COLUMN1,COLUMN2,COLUMN3)
    ),
    
    --explode each array and FULL join them
    c1 as (
    select i.id, v.column1, p
      from input i
           lateral view posexplode(i.COLUMN1) v as p,column1
    ),
    
    c2 as (
    select i.id, v.column2, p
      from input i
           lateral view posexplode(i.COLUMN2) v as p,column2
    ),
    
    c3 as (
    select i.id, v.column3, p
      from input i
           lateral view posexplode(i.COLUMN3) v as p,column3
    )
    
    --FULL JOIN
    select coalesce(c1.id,c2.id,c3.id) id, c1.column1, c2.column2, c3.column3
      from c1 
           full join c2 on c1.id=c2.id and c1.p=c2.p
           full join c3 on nvl(c1.id,c2.id)=c3.id and nvl(c1.p,c2.p)=c3.p --note NVL usage
    ;   
    

    结果:

    OK
    id      column1 column2 column3
    1       M       1       5
    1       S       2       6
    1       E       3       7
    1       T       4       NULL
    2       A       6       2
    2       B       5       4
    2       C       8       3
    2       NULL    7       0
    2       NULL    9       1
    2       NULL    1       NULL
    

    【讨论】:

      【解决方案2】:

      Explode 是 hive 中提供的 UDTF,您可以使用它来将数据从列拆分为行。

      SELECT ID1, col1,col2,col3
      FROM tableName 
      lateral view explode(split(COLUMN1,',')) cols1 AS col1
      lateral view explode(split(COLUMN2,',')) cols2 AS col2
      lateral view explode(split(COLUMN3,',')) cols3 AS col3
      

      【讨论】:

      • 你测试过这样的查询吗?在这种情况下,多个横向视图将产生笛卡尔积
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2012-09-17
      • 2017-02-20
      • 2020-05-07
      • 2020-08-28
      • 2021-05-26
      • 1970-01-01
      相关资源
      最近更新 更多