2016-07-15 108 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代替,并从输出文件中对行进行采样。