如何随机打乱 bigquery 数据集中大表的所有行?
Posted
技术标签:
【中文标题】如何随机打乱 bigquery 数据集中大表的所有行?【英文标题】:How to random shuffle all rows of a large table in bigquery dataset? 【发布时间】:2019-06-04 03:29:31 【问题描述】:像"select id from table order by rand()"
这样的查询所需的内存将超过分配的内存,从而导致查询失败。如何从一个非常大的表中获得所有行的随机排列?表的大小超过 10 亿行。
【问题讨论】:
你能告诉我们你为什么认为你需要它吗?你真正的用例是什么? 感谢您的建议!我对收到的每一个有用的回复都投赞成票。但是,由于声誉低或我的其他原因,我的点赞不会显示给其他用户。 我们团队的业务需要从整个数据集中反复采样。样本量每次从 8000 万到 100k 不等,预计每个样本不会与其他最近的样本重复。我们有超过 10 亿行要处理,每次我需要从数据集中进行采样时都需要进行重复数据删除。 我明白了。谢谢 感谢您的澄清 - 有道理。看答案 【参考方案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 到<ratio of sample> - 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 个采样行
【讨论】:
以上是关于如何随机打乱 bigquery 数据集中大表的所有行?的主要内容,如果未能解决你的问题,请参考以下文章
使用 python 和 BigQuery API 获取 BigQuery 数据集中的表列表