2015-10-22 92 views
3

我試圖在BigQuery中運行查詢,但收到「查詢執行期間超出資源」。在BigQuery中優化查詢

其實,我有兩個表:

Table user: 
Id | User | Latitude | Longitude 
1 | 1  | 50.83 | 4.01 
2 | 1  | 50.84 | 4.03 
3 | 2  | 48.78 | 2.87 
4 | 3  | 47.42 | 8.53 
… 
Table point_of_interest: 
Id | Latitude | Longitude | Range | Tag 
1 | 50.81 | 3.98  | 0.05 | a;b;c;d 
2 | 50.85 | 4.03  | 0.025 | a;c;e;f 
3 | 40.80 | 3.87  | 0.04 | a;d;g 
4 | 47.42 | 8.57  | 0.08 | b 
… 

目的是聯接表來標記的緯度,經度和範圍內的所有用戶。

對於這一點,我使用的查詢:

SELECT 
    u.User AS id, 
    GROUP_CONCAT(poi.Tag) AS tag 
FROM (
    SELECT 
    u.User, 
    poi.Tag, 
    FROM 
    [user] u 
    CROSS JOIN 
    [point_of_interest] poi 
    WHERE 
    u.Latitude BETWEEN poi.Latitude – poi.Range AND poi.Latitude + poi.Range 
    AND 
    u.Longitude BETWEEN poi.Longitude – poi.Range AND poi.Longitude + poi.Range) 
GROUP BY 
    id 

用戶表目前是520 MB和point_of_interest表只有565 KB,但可能會在時間成長。

我想知道是否有更好的方法來實現這個目標,以及最好的體系結構。

編輯:

我還使用了一系列LEFT JOIN EACH但BigQuery的只支持ON關鍵字後平等陳述嘗試。

+0

不是大小,但記錄的數量很重要。每張表中的記錄數是多少? – Pentium10

+0

您是否嘗試過「GROUP BY BY BY」?您是否仍然超出資源? – Pentium10

+0

我嘗試了GROUP EACH BY,並得到相同的錯誤。用戶表包含3 000 000條記錄和point_of_interest表100 000. – Nexus

回答

1

您需要分割您的表並運行多個較小的查詢。

事情是這樣的:

SELECT * FROM table WHERE ABS(HASH(id) % 100) == 0 
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 1 
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 2 
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 3 
... 
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 99 

,但你需要找到一個像樣的高數量,而不是100在我的例子,並寫一段代碼,自動執行此爲您服務。首先在碎片中手動使用一個合適的記錄邊緣嘗試一個碎片。

您可以將WRITE_APPEND結果放入相同的目的地表並與原始數據分開存儲。