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