Join 使用配置单元高效地连接不同列上的相同表

Join 使用配置单元高效地连接不同列上的相同表,join,hive,hiveql,Join,Hive,Hiveql,我正在尽可能有效地解决这个问题 假设我有一个表,ids,其中一列包含整数列表,我们称之为“ids”: ids 0 1 2 3 4 5 6 我还有另一个表,items,有几列整数: item1 item2 item3 item4 5 2 2 4 9 2 1 19 0 25 9 2 我要做的是从表2中选择所有列,但如果值不在“ids”表中,我希望为NULL

我正在尽可能有效地解决这个问题

假设我有一个表,ids,其中一列包含整数列表,我们称之为“ids”:

ids
0
1
2
3
4
5
6
我还有另一个表,items,有几列整数:

item1    item2    item3    item4
5        2        2        4
9        2        1        19
0        25       9        2
我要做的是从表2中选择所有列,但如果值不在“ids”表中,我希望为NULL。所以我的结果是这样的:

item1    item2    item3    item4
5        2        2        4
NULL     2        1        NULL
0        NULL     NULL     2
我可以通过从项中选择并为每列连接到ids来实现这一点:

SELECT CASE WHEN ids1.id IS NOT NULL THEN items.item1 ELSE NULL,
       CASE WHEN ids2.id IS NOT NULL THEN items.item2 ELSE NULL,
       CASE WHEN ids3.id IS NOT NULL THEN items.item3 ELSE NULL,
       CASE WHEN ids4.id IS NOT NULL THEN items.item4 ELSE NULL,
FROM items
LEFT OUTER JOIN ids ids1 ON (ids1.id = items.item1),
LEFT OUTER JOIN ids ids2 ON (ids2.id = items.item2),
LEFT OUTER JOIN ids ids3 ON (ids3.id = items.item3),
LEFT OUTER JOIN ids ids4 ON (ids4.id = items.item4)
不幸的是,当这些表变大(数百万行)时,必须连接到同一个表4次是相当困难的。有没有更快或更有效的方法


谢谢

下面是一个循环的示例,通过对其进行规范化,左连接以测试ID,最后将其旋转回来

create table ids ( id int );
insert ids values(0),(1),(2),(3),(4),(5),(6);
create table items (itemid int, item1 int, item2 int, item3 int, item4 int);
insert items select
1,5,2,2,4 union all select
2,9,2,1,19 union all select
3,0,25,9,2;

select *
from (
    select u.itemid,ids.id,u.item
    from items
    unpivot (id for item in (item1,item2,item3,item4)) u
    left join ids on ids.id = u.id
) x
pivot (max(id) for item in (item1,item2,item3,item4)) p

谢谢你看这个。不幸的是,我的理解是Hive不支持PIVOT或UNPIVOT。你能找到其他方法吗?谢谢您可能想看看这个线程