2012-11-20 59 views
6

我知道這項工作正在做,以提高BIGQUERY的加入功能,而不是在這裏咆哮,但是這將是很難分析「太字節」的數據集爲「廣告」,如果連接無法正常使用。加入對谷歌的BigQuery

OK,回到這個問題,我有兩個表一個是600兆,另一個是50Megs,我曾嘗試做加盟,我必須留約小表的錯誤。我做了一些調查,發現Bigquery兩個表都大於7MB?

因此,基於一些建議,我在網上找到我沒有選擇在較小的表的問題的數據集,並在新表中保存它,新的數據集是12MB和600K行了兩列。然後我又試了一次我的查詢,但我仍然得到同樣的錯誤:

Query Failed : Error: Large table cdrs_test.geoIP_Left must appear as the leftmost table in a join query 

geoIP_Left是12兆,另一臺是600Megs ..

這個問題能以某種方式固定還是我打掉?如果有的話,任何人都知道我可以用來分析支持連接的大數據集的其他服務?

編輯:這是實際的查詢;

SELECT COUNT(results.cc_card) AS count, 
     sum(results.sessiontime) AS time, 
     geoIP_Left.place AS place 
FROM cdrs_test.cdrs_2010_5 AS results 
JOIN cdrs_test.geoIP_Left AS geoIP_table 
    ON results.cc_card = geoIP_table.vcard 
WHERE results.sessiontime > 0 AND results.countryName Contains 'India' 
GROUP BY place; 
+1

你能顯示你的實際查詢嗎? –

+0

當然..你去吧 – user1838066

+0

SELECT COUNT(results.cc_card)AS count,sum(results.sessiontime)AS time,geoIP_Left.place AS place from cdrs_test.cdrs_2010_5 AS results JOIN cdrs_test.geoIP_Left AS geoIP_table ON results.cc_card = geoIP_table .vcard WHERE results.sessiontime> 0 AND results.countryName包含'India'GROUP BY地方; – user1838066

回答

10

你可以表達這個查詢作爲僅列從cdrs_test.geoIP_Left,你有興趣在引用子查詢中。見第二個例子here

SELECT 
    COUNT(results.cc_card) AS count, 
    sum(results.sessiontime) AS time, 
    geoIP_table.place AS place 
FROM 
    cdrs_test.cdrs_2010_5 AS results 
JOIN 
    (SELECT place, vcard FROM cdrs_test.geoIP_Left) 
AS 
    geoIP_table 
ON 
    results.cc_card = geoIP_table.vcard 
WHERE 
    results.sessiontime > 0 AND results.countryName CONTAINS 'India' 
GROUP BY 
    place; 

您也可以簡單地運行多個查詢 - 請注意,你可以明確的查詢結果保存爲一個命名錶,並使用該表在以後的查詢。

最後,另一種選擇是使用(例如)MapReduce轉換管道或由BigQuery ETL合作伙伴之一提供的ETL tool預加入數據。

+1

2013更新:您現在可以使用JOIN EACH在兩​​個大表中進行JOIN加入。 –

5

正如Felipe在評論中提到的那樣。 BigQuery允許修改器「EACH」加入以允許2個大表的JOIN。從查詢參考頁 -

正常JOIN操作要求右側表包含少於8 MB的壓縮數據。 EACH修飾符是一個提示,通知查詢執行引擎JOIN可能引用兩個大表。 CROSS JOIN子句中不能使用EACH修飾符。

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