Google bigquery 如何在bigquery数据集中随机洗牌大表的所有行?

Google bigquery 如何在bigquery数据集中随机洗牌大表的所有行?,google-bigquery,Google Bigquery,查询所需的内存(如“从表order by rand()中选择id”)将超过分配的内存,从而导致查询失败。如何从一个相当大的表中获得所有行的随机排列?表的大小超过10亿行 我们团队的业务需要从整个数据集中重复采样。每次的样本量从8000万到10万不等 下面是BigQuery标准SQL,它使用的表有120多亿行,所以应该也适用于您:o) 查询模式为: #standardSQL SELECT start_position FROM `bigquery-public-data.genomics_ric

查询所需的内存(如
“从表order by rand()中选择id”)
将超过分配的内存,从而导致查询失败。如何从一个相当大的表中获得所有行的随机排列?表的大小超过10亿行


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

下面是BigQuery标准SQL,它使用的表有120多亿行,所以应该也适用于您: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
上图在8秒内返回了99770个采样行

对于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), 121867) = 1
#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秒内返回了80175660个采样行

您能告诉我们为什么需要它吗?你真正的用例是什么?顺便说一句,检查你之前的问题。这是一个很好的实践,通过投票和接受的方式提供一些关于答案的反馈-当然,如果他们有帮助的话!谢谢你的建议!我对收到的每一个有用的回复都投了赞成票。但是,由于我的声誉不高或其他原因,我的上传没有显示给其他用户。我们团队的业务需要从整个数据集中重复采样。样本量每次从8000万到100k不等,每个样本预计不会与其他最近的样本重复。我们有超过10亿行需要操作,每次需要从数据集中采样时都要进行重复数据消除,这很累人。我明白了。非常感谢。