我从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()
答案 0 :(得分:0)
我建议使用tabledata.list分页pageToken,并从每个页面获取样本行。这应该更好地扩展。
我看到的另一个(完全不同的)选项是使用Table Decorators
您可以循环语法生成随机时间(用于快照)或时间范围(用于范围),并仅查询提取所需数据的数据部分。
注意限制:这将允许您对少于7天的数据进行采样。
答案 1 :(得分:0)
tabledata.list对于表中的任意查找并不是特别有效,特别是当您在稍后和稍后查看表时。它并不是真正设计用于整个表的有效数据检索,而是用于查看表中数据的前几页。
如果要对表中的所有数据运行某些操作,但不运行查询,则应该使用extract job to GCS代替输出文件中的行。