我有两张表如下:
表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。
苹果,芒果,葡萄和桃子ids可以是一样的。但是,new_id值将是唯一的。这可能在Hive中吗?在Hive中似乎没有任何unpivot / pivot功能。
任何帮助都会非常棒。谢谢!
答案 0 :(得分:15)
每当我想在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
答案 1 :(得分:-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