随机抽样完成行

时间:2016-07-15 19:30:42

标签: google-bigquery

我从question了解到,人们可以随机抽样RAND

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

但这需要全表扫描并产生相同的成本。我想知道是否有更有效的方法?

我正在尝试使用tabledata.list API,但在java.net.SocketTimeoutException: Read timed out非常大(即> 10000000)时获得index。这个操作不是O(1)吗?

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

2 个答案:

答案 0 :(得分:0)

我建议使用tabledata.list分页pageToken,并从每个页面获取样本行。这应该更好地扩展。

我看到的另一个(完全不同的)选项是使用Table Decorators
您可以循环语法生成随机时间(用于快照)或时间范围(用于范围),并仅查询提取所需数据的数据部分。
注意限制:这将允许您对少于7天的数据进行采样。

答案 1 :(得分:0)

tabledata.list对于表中的任意查找并不是特别有效,特别是当您在稍后和稍后查看表时。它并不是真正设计用于整个表的有效数据检索,而是用于查看表中数据的前几页。

如果要对表中的所有数据运行某些操作,但不运行查询,则应该使用extract job to GCS代替输出文件中的行。