2016-07-15 325 views
0

我知道從這個question可以做隨機抽樣RAND隨機抽樣完成行

SELECT * FROM [table] WHERE RAND() < percentage

但是這需要全表掃描,並承擔相當的成本。我想知道是否有更有效的方法?

我正在試驗tabledata.list API,但當index非常大(即> 10000000)時得到java.net.SocketTimeoutException: Read timed out。這個操作不是O(1)嗎?

bigquery .tabledata() .list(tableRef.getProjectId, tableRef.getDatasetId, tableRef.getTableId) .setStartIndex(index) .setMaxResults(1L) .execute()

回答

0

我會建議尋呼tabledata.listpageToken,並從每個頁面收集樣品行。這應該好得多。

另一個(完全不同的)選擇我看到的是使用的Table Decorators
可以在循環語法產生隨機時間(快照)或時間幀(對於範圍),僅提取所需的數據的數據部分的查詢。
注意限制:這將允許您採樣少於7天的數據。

+0

我的用例是統一採樣一個小的固定數量的行,而不需要完整的表IO。 'pageToken'方法仍然需要遍歷表中的所有行? –

+0

nope。您可以隨時停止分頁 –

0

對於表中的任意查找,tabledata.list並不是特別有效的,特別是當您在稍後和之後查看錶時。它並非真正爲整個表格的高效數據檢索而設計,而更多的是查看錶格中前幾頁的數據。

如果要對錶中的所有數據運行某些操作,但不運行查詢,則應該使用extract job to GCS代替,並從輸出文件中對行進行採樣。