Hadoop-Hive |在Hive中将单行列转换为多行

时间:2017-05-18 05:44:55

标签: hadoop hive hiveql

我有一个像这样的Hive表

 Created_date   ID1 Name1 Age1 Gender1 Name2 ID2 Age2 Gender2 ID3 Name3  Age3 Gender3....
  2014-02-01    1   ABC   21    M      MNP    2  22   F       3   XYZ    25   M
  2015-06-06    11  LMP   31    F      PLL   12  42   M       13  UIP    37   F

此表可能没有。重复设置的4列对。这4列的顺序也没有修复,可能还有1或2个不重复的列,如created_date

我需要将上面的表转换为一个新的Hive表,其中只有4列ID,Name,Age和Gender,如下所示。我的结果表中不需要created_date列。

ID  Name  Age Gender
1   ABC   21  M
2   MNP   22  F
3   XYZ   25  M
11  LMP   31  F
12  PLL   42  M
13  UIP   37  F

请建议我如何在Hive中实现这一目标。

2 个答案:

答案 0 :(得分:2)

select  inline
        (
            array
            (
                struct(ID1,Name1,Age1,Gender1)
               ,struct(ID2,Name2,Age2,Gender2)
               ,struct(ID3,Name3,Age3,Gender3)
             )
        ) as (ID,Name,Age,Gender)

 from   mytable
+----+------+-----+--------+
| id | name | age | gender |
+----+------+-----+--------+
|  1 | ABC  |  21 | M      |
|  2 | MNP  |  22 | F      |
|  3 | XYZ  |  25 | M      |
| 11 | LMP  |  31 | F      |
| 12 | PLL  |  42 | M      |
| 13 | UIP  |  37 | F      |
+----+------+-----+--------+

答案 1 :(得分:-1)

使用Hive UDTF可以解决您的问题。用户定义的表格函数(UDTF)作为输入在一行上工作,并返回多行作为输出。

例如:

我们有一个文件,其中有多条记录。每条记录都包含客户,商家1,商家2的列表。我们希望获得与客户相关的所有不同客户的列表。

.as-console-wrapper { max-height: 100%!important; top: 0; }

现在您可以编写一个名为爆炸的UDTF,它可以获得预期的输出,并且可以在以下查询中使用:

Sample Input: 
Cust1, Merchant1, Merchant2
Cust2, Merchant1, Merchant2

Expected Output
Cust1, Merchant1
Cust1, Merchant2
Cust2, Merchant1
Cust2, Merchant2

你可以参考: https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide+UDTF