我有两张桌子:
表A:
表B:
我想得到B中的所有行,其中B.id1或B.id2是A.id(所有A.id都是不同的。这不是B的情况。)
我已经尝试了查询:
User
这很好用,除了它复制id1和id2都在id中的行。 A是一个相对较小的表(大约5000行),而B是相当大的(大约10亿行)。
我想到的解决方案涉及按B列进行分组,以便消除不同的行,将A的ID收集到数组中并在数组中搜索id1和id2,并使用2个单独的查询来搜索id1和id2分别然后联合两个表。这些都显得非常低效,特别是考虑到表格的大小。有没有更好的办法让我失踪?感谢。
答案 0 :(得分:3)
我会使用exists
:
select b.*
from b
where exists (select 1 from a where a.id = b.id1) or
exists (select 1 from a where a.id = b.id2);
在大多数数据库中,这将是此类逻辑的最有效方法。我不是百分之百确定在Hive中这是真的,但绝对值得一试。
另一种方法是left join
s:
select b.*
from b left join
a a1
on b.id1 = a1.id left join
a a2
on b.id2 = a2.id
where a1.id is not null or a2.id is not null;
如果exists
没有很好的优化,那么在Hive中可能会有更好的性能。