2012-07-31 52 views
2

我想加入兩個表格,每個表格有57,191行。 BigQ在內部/左側尋找更大的桌子,右側尋找更小的桌子。當我在左邊的表B中運行它時,它的錯誤是'大表A必須首先出現'。當我切換查詢並將表A置於From子句中時,它的錯誤爲'大表B必須首先出現'。所以當我按照它的指示去做時,它並沒有解決它,但卻暗示了我的第一個(不正確的)嘗試,除非我以某種方式來修補它。在Google BigQuery中加入兩個同等大小的表格

有點諷刺的是,如果2個表的大小相同,那麼它決定一個更大,據推測,這個大小並不小於另一個大小。我試圖找到一個解決方案,其中不包括我在表中添加無意義的行,然後在連接工作後嘗試刪除它(因爲BigQ現在不加載我的單行csv文件,我相信它是由於我的錯誤。)

的谷歌SQL語法聯接規則似乎是

「join_type BigQuery支援INNER(默認)和LEFT OUTER連接。 TABLE_2 這是第二次表中加入,它必須很小,並且會連接到出現在FROM子句中的表中,注意這可以是一個表名或另一個SELECT子句,在這種情況下,你必須提供一個別名 join_condition_1,...,join _condition_N,... 連接條件集合,它必須是相等條件的集合,所有這些條件必須滿足才能將行包含在結果中。 (也就是說,我們只支持連接這些條件。)「

我運行的實際SQL是

SELECT lt.activeprosperloans,[fieldsredacted], ... 
FROM prosperloans1.listings2 AS lt 
JOIN prosperloans1.zjoinedperfloans as ln 
ON lt.key = listingkey; 

與實際誤差寫着: 錯誤:大表prosperloans1.zjoinedperfloans必須顯示爲在連接查詢的最左邊的表

感謝 肖恩

回答

1

由於這個問題得到回答,BigQuery的加入JOIN EACH,這是連接兩個大表的方式。見Fh的的回答˚F或關於如何使用JOIN EACH的說明。

此響應的其餘部分用於歷史目的: 大型表(用於加入)超過7 MB。爲了完成一個連接,整個小表被髮送到集羣中的每個節點,所以我們對它進行了相當大的限制。儘管兩者的行數相同,但一個表大於7 MB,而另一個表更小。

減小其中一個表的大小的一種方法是在查詢中應用過濾器和列過濾器,並將結果另存爲另一個臨時表,然後將JOIN應用於臨時表。例如。如果表中有10列的數據跨越了一個月的數據,但只需要3列用於連接查詢和最後一天的數據,則可以先選擇三列和最近的數據,然後給結果命名。然後,您可以對該表進行連接。

+0

無後顧之憂。由於它不是真正的「大數據」,我有把它帶入Excel或谷歌文檔的好處,並且合併它,所以現在就可以做到這一點。 – user1558422 2012-07-31 14:26:54

3

請注意,現在您可以使用JOIN EACH來有效解決問題。

您的查詢就會變成:

SELECT lt.activeprosperloans,[fieldsredacted], ... 
FROM prosperloans1.listings2 AS lt 
JOIN prosperloans1.zjoinedperfloans as ln 
ON lt.key = listingkey; 

從文檔:

如果可能的話,使用JOIN沒有EACH修改以獲得最佳性能。當表格尺寸對於JOIN來說太大時,使用JOIN EACH。

https://developers.google.com/bigquery/docs/query-reference#joins