Hadoop配置单元|将配置单元中的单行列转换为多行

Hadoop配置单元|将配置单元中的单行列转换为多行,hadoop,hive,hiveql,Hadoop,Hive,Hiveql,我有一张像这样的蜂巢桌 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 UI

我有一张像这样的蜂巢桌

 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那样重复

我需要将上面的表转换成一个新的配置单元表,它只有4列ID、Name、Age和Gender,如下所示。我不需要在结果表中创建日期列

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中实现这一点

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



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

例如:

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

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

Expected Output
Cust1, Merchant1
Cust1, Merchant2
Cust2, Merchant1
Cust2, Merchant2
现在,您可以编写一个名为Explode的UDTF,该UDTF将获得预期的输出,并可用于以下查询:

Select Explode(customer, firstMerchant, secondMerchant) 
AS (cust, merchant) 
from Merchants
你可以参考:
您的问题可以使用Hive UDTF解决。用户定义的表格函数(UDTF)将一行作为输入,并返回多行作为输出

例如:

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

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

Expected Output
Cust1, Merchant1
Cust1, Merchant2
Cust2, Merchant1
Cust2, Merchant2
现在,您可以编写一个名为Explode的UDTF,该UDTF将获得预期的输出,并可用于以下查询:

Select Explode(customer, firstMerchant, secondMerchant) 
AS (cust, merchant) 
from Merchants
你可以参考:

您可以使用unionall,但为此,您应该知道有多少列没有。列数不是固定的。Ankit,特定配置单元表中的列数始终是固定的。在您的示例中,我看到
Name2
位于
ID2
之前。这是故意的吗?
ID
可以被信任为唯一的吗?您可以使用unionall,但为此,您应该知道您有多少列没有。列数不是固定的。Ankit,特定配置单元表中的列数始终是固定的。在您的示例中,我看到
Name2
位于
ID2
之前。这是故意的吗?可以相信
ID
是唯一的吗?如果你不知道模式,这是一个怎样的表?如果你的模式是固定的,即如果你知道一条记录最多有多少列,你仍然可以拆分记录如果你不知道模式,这是一个表吗?如果你的模式是固定的,即,如果知道一条记录的最大列数,仍然可以拆分这些记录