【问题标题】:Hive - Unpivot functionality in hiveHive - Hive 中的 Unpivot 功能
【发布时间】:2015-09-17 03:04:24
【问题描述】:

我有两个表如下:

表 A

userid | code | code_name | property_id
0001   | 1    | apple_id  | Y1234
0031   | 4    | mango_id  | G4567
0008   | 3    | grape_id  | H1209
00013  | 2    | peach_id  | Z5643

表 2

apple_id | mango_id | grape_id | peach_id | new_id
Y1234    |  R1890   |          |          | N456098
         | G4567    |          |  B3490   | N002345
T3336    |          | H1209    |  F3467   | N129087
         |  D7865   | J6543    |  Z5643   | N109876

所需的结果表

userid | new_id
0001   | N456098
0031   | N002345
0008   | N129087
00013  | N109876

使用表A中的code_name,我想在表B中从表A中找到相应的property_id。基本上,匹配表B中的列名。目的是得到对应的new_id。

苹果、芒果、葡萄和桃子的 ID 可以相同。但是,new_id 值将是唯一的。

这在 Hive 中可行吗? Hive 中似乎没有任何 unpivot/pivot 功能。

任何帮助都会非常棒。谢谢!

【问题讨论】:

  • 这个问题你解决了吗?
  • 您能否重新考虑您选择的正确答案。 GoBrewers14 提到的 map-explode 方法是一种更好的方法。

标签: sql hive unpivot


【解决方案1】:

每当我想在 Hive 中对表进行透视时,我都会将 key:value 对收集到一个映射中,然后引用下一级中的每个键,创建新列。这正好相反。

查询:

select a.userid, y.new_id
from (
  select new_id, fruit_name, fruit_code
  from (
    select new_id, map("apple_id", apple_id
                     , "mango_id", mango_id
                     , "grape_id", grape_id
                     , "peach_id", peach_id) as fruit_map
    from table_2 ) x
  lateral view explode(fruit_map) exptbl1 as fruit_name, fruit_code ) y
join table_A a
on (y.fruit_code=a.property_id)

输出:

0001    N456098
0031    N002345
0008    N129087
00013   N109876

【讨论】:

  • 这应该被标记为正确答案。此类问题的地图和爆炸的出色演示。与使用 UNIONS 相比,这是一种更好的方法,尤其是在 hive 中处理来自 SQL 的大型 map-reduce 作业时。
  • 如何扩展它,这样您就不必手动编写所有不同的级别(即苹果、芒果、葡萄、桃子)。如果像 select distinct code_name 这样的东西可以作为创建新列的输入,那将是理想的
【解决方案2】:

您实际上不需要反透视即可获得结果。

SELECT * FROM 
(
    SELECT userid,
        CASE WHEN property_id = apple_id THEN new_id  
             WHEN property_id = mango_id THEN new_id  
             WHEN property_id = grape_id THEN new_id  
             WHEN property_id = peach_id THEN new_id
        END AS newid
    FROM
    (SELECT * FROM a FULL JOIN b) X
) y
WHERE newid IS NOT NULL;

结果:

y.userid  y.newid
1         N456098
31        N002345
8         N129087
13        N109876

【讨论】:

  • 这个答案是否被否决了,因为它在计算上比爆炸函数更昂贵?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多