以下罗列了部分 BQ 中进行随机抽样的方法:
1. RAND() 函数
RANK 函数生成 0,1 范围内的 FLOAT64 类型的随机值,使用 RANK() 生成随机值,然后使用 ORDER 进行排序,并取前 n 行,即可完成完全随机抽样。
#standardSQL
SELECT
RAND() as x
FROM `xxx.xxx.xxx`
ORDER BY x
LIMIT 1000
类似的方法还有许多,不一一列举。
2. MOD 函数
MOD 函数返回余数,例如:
mod(14, 3) --> 2
下面即为一个通过 MOD 进行抽样的方式,
MOD(ABS(FARM_FINGERPRINT(col),1000) = n)
这里需要注意的是 FARM_FINGERPRINT
这是一个哈希散列函数,针对特定的输入,输出一个 INT64 数字。
然后通过对这个数字 /1000 余特定数,因为 FARM_FINGERPRINT
的余数,肯定在 0~999 范围内,而 FARM_FINGERPRINT
得到的数字是随机的。
所以 MOD(ABS(FARM_FINGERPRINT(col),1000) = n)
即可完成 1/1000 的抽样。