如何随机重排bigquery数据集中大表的所有行?

时间:2019-06-04 03:29:31

标签: google-bigquery

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

1 个答案:

答案 0 :(得分:2)

  

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

以下内容适用于BigQuery Standard 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个采样行