2017-07-19 35 views

回答

3

如果特定查詢的內存不足,BigQuery將不會丟棄數據;你會得到一個錯誤。你應該儘量保持你的行大小低於100MB,因爲除此之外你會開始犯錯。你可以嘗試用這樣一個例子創建一個大的字符串:

#standardSQL 
SELECT STRING_AGG(word) AS words FROM `bigquery-public-data.samples.shakespeare`; 

有164656行此表中,而這個查詢(面積約爲一兆字節)創建了1168286個字符的字符串。你會開始看到一個錯誤,如果你運行需要多一些百兆的順序執行的單個節點上查詢,但:

#standardSQL 
SELECT STRING_AGG(CONCAT(word, corpus)) AS words 
FROM `bigquery-public-data.samples.shakespeare` 
CROSS JOIN UNNEST(GENERATE_ARRAY(1, 1000)); 

這將導致一個錯誤:

Resources exceeded during query execution. 

如果您單擊UI中的「說明」選項卡,則可以看到,在構建STRING_AGG的結果時,階段1期間發生故障。在這種情況下,該字符串的長度將是3,303,599,000個字符,或者大小約爲3.3 GB。

+0

有沒有一種方法可以檢查處理查詢(任何報告或類似「解釋」)時不同節點使用的數據量? – divyum

+0

您需要等待查詢完成,然後查看「解釋」選項卡,因爲執行策略可能隨着它的運行而改變。 –

+0

我檢查瞭解釋標籤,它只給出了輸入和輸出行的數量,而不是節點數據統計。 – divyum

1

添加到艾略特的答案 - 如何解決:

這個查詢(長尾)失敗:

#standardSQL 
SELECT STRING_AGG(CONCAT(word, corpus)) AS words 
FROM `bigquery-public-data.samples.shakespeare` 
CROSS JOIN UNNEST(GENERATE_ARRAY(1, 1000)); 

但是你可以限制連接起來以獲得一個有效的解決方案串的數量:

#standardSQL 
SELECT STRING_AGG(CONCAT(word, corpus) LIMIT 10) AS words 
FROM `bigquery-public-data.samples.shakespeare` 
CROSS JOIN UNNEST(GENERATE_ARRAY(1, 1000)); 
相關問題