【问题标题】:How to random shuffle all rows of a large table in bigquery dataset?如何随机打乱 bigquery 数据集中大表的所有行?
【发布时间】:2019-06-04 03:29:31
【问题描述】:

"select id from table order by rand()" 这样的查询所需的内存将超过分配的内存,从而导致查询失败。如何从一个非常大的表中获得所有行的随机排列?表的大小超过 10 亿行。

【问题讨论】:

  • 你能告诉我们你为什么认为你需要它吗?你真正的用例是什么?
  • 感谢您的建议!我对收到的每一个有用的回复都投赞成票。但是,由于声誉低或我的其他原因,我的点赞不会显示给其他用户。
  • 我们团队的业务需要从整个数据集中反复采样。样本量每次从 8000 万到 100k 不等,预计每个样本不会与其他最近的样本重复。我们有超过 10 亿行要处理,每次我需要从数据集中进行采样时都需要进行重复数据删除。
  • 我明白了。谢谢
  • 感谢您的澄清 - 有道理。看答案

标签: google-bigquery


【解决方案1】:

我们团队的业务需要从整个数据集中反复采样。样本量每次从 8000 万到 100k 不等……

以下是 BigQuery 标准 SQL 并使用包含 12 多亿行的表,因此也应该适合您:o)

查询的模式是:

#standardSQL
SELECT start_position 
FROM `bigquery-public-data.genomics_rice.Rice3K_DeepVariant_Os_Nipponbare_Reference_IRGSP_1_0`
WHERE MOD(CAST(<total number of rows in table> * RAND() AS INT64), <ratio of sample>) = 1

正式 = CAST(/AS INT64)
= 1 中代替1 - 可以是0 到&lt;ratio of sample&gt; - 1 之间的任何整数

所以对于 100K 的样本 - 你可以使用

#standardSQL
SELECT start_position 
FROM `bigquery-public-data.genomics_rice.Rice3K_DeepVariant_Os_Nipponbare_Reference_IRGSP_1_0`
WHERE MOD(CAST(12186710727 * RAND() AS INT64), 121867) = 1

以上在 8 秒内返回了 99,770 个采样行

对于 80M 的样本 - 你可以使用

#standardSQL
SELECT start_position 
FROM `bigquery-public-data.genomics_rice.Rice3K_DeepVariant_Os_Nipponbare_Reference_IRGSP_1_0`
WHERE MOD(CAST(12186710727 * RAND() AS INT64), 152) = 1    

在 13 秒内返回 80,175,660 个采样行

【讨论】:

    猜你喜欢
    • 2019-12-05
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    相关资源
    最近更新 更多