【问题标题】:Random sampling complete rows随机抽样完整行
【发布时间】:2016-11-19 02:50:29
【问题描述】:

我从这个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()

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

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

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

    【讨论】:

    • 我的用例是在不进行全表 IO 的情况下统一采样少量固定数量的行。 pageToken 方法仍然需要遍历表中的所有行?
    【解决方案2】:

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

    如果您想对表中的所有数据运行一些操作,但不运行查询,您可能应该改用extract job to GCS,并从输出文件中采样行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多