查询所需的内存"select id from table order by rand()"将超出分配的内存,从而导致查询失败。如何从一个相当大的表中获得所有行的随机排列?表的大小超过 10 亿行。
我们团队的业务需要对整个数据集进行重复采样。每次样本量从8000万到10万不等……
下面是 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
Run Code Online (Sandbox Code Playgroud)
形式上 = CAST( / AS INT64)
并且 in 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
Run Code Online (Sandbox Code Playgroud)
上面在 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
Run Code Online (Sandbox Code Playgroud)
13 秒内返回 80,175,660 个采样行
| 归档时间: |
|
| 查看次数: |
3109 次 |
| 最近记录: |