使用Hive在不同列上有效地连接相同的表

时间:2012-10-05 01:45:10

标签: join hive hiveql

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

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

ids
0
1
2
3
4
5
6

我还有另一张表,有几列整数:

item1    item2    item3    item4
5        2        2        4
9        2        1        19
0        25       9        2

我想要做的是从table2中选择所有列,但如果值不在'ids'表中,我想要一个NULL。所以我的结果看起来像这样:

item1    item2    item3    item4
5        2        2        4
NULL     2        1        NULL
0        NULL     NULL     2

我可以通过从中选择并加入每个列的 ID 来执行此操作:

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次才是相当大的拖累。有更快或更有效的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

这是一个循环规范化的示例,左连接以测试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