2016-07-21 41 views
0

我有兩個表:加入多個列的兩個表沒有重複行

表A:

  • ID

表B:

  • ID1
  • id2
  • ...(很多其他列)

我想要得到B中的所有行,其中B.id1或B.id2是A.id(所有A.id都是不同的。 B)情況並非如此)。

我試着查詢:

create table C as 
select B.* 
from B 
join A on (A.id = B.id1 or A.id = B.id2); 

這個偉大的工程,除了它複製其中ID1和ID2都在ID列。 A是一個相對較小的表格(約5000行),而B是相當大的(約10億行)。

我想過的解決方案涉及按B的列進行分組,以便消除不同的行,將A的ID收集到數組中,並搜索數組中的id1和id2,並使用2個單獨的查詢來搜索分別爲id1和id2,然後合併兩個表。這些看起來都非常低效,特別是考慮到表格的大小。有沒有更好的方法來做到這一點,我錯過了?謝謝。

+1

使用'select distinct'有什麼問題? – sgeddes

+0

考慮到我的數據量,這太慢了。 – TheSlimyDog

回答

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); 

在大多數數據庫,這將是對於這種類型的邏輯的最有效的方法。我不是100%確定這在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沒有很好的優化。

+0

謝謝!因爲配置單元不支持相關的子查詢,所以我認爲第一種方法可行,但替代方案看起來很完美。我甚至沒有考慮使用左連接,但它很有意義。 – TheSlimyDog

+0

@TheSlimyDog。 。 。 Hive支持使用'EXISTS'(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries)進行相關子查詢,儘管舊版本可能不支持。 –

+0

我試過了,第一個版本沒有工作。我收到錯誤: FAILED:SemanticException [Error 10249]:Line 4:6不支持的子查詢表達式'id2':只支持1個子查詢表達式。 這似乎工作,如果我只有一個表達,但都沒有。 – TheSlimyDog