在BigQuery (标准SQL)中,我想从查询中随机分割结果行。
例如,我目前有一个表mytable
,其中有列(order_id
、created_at
、country
):
一方面,10%/90%的分裂
SELECT
*
FROM
`mytable`
WHERE RAND() <= 10/90
另一方面,
SELECT
*
FROM
`mytable`
WHERE RAND() > 10/90
,但这会产生不一致的分割。是否有正确实现这一目标的方法?
发布于 2018-05-20 22:22:37
解决方案是在一个列上使用散列函数,该函数唯一地区分源表的每一行(例如,这里的orderId
)。
BigQuery有一个散列函数,目标类型是有符号的INT64
(以及源STRING
或BYTES
):FARM_FINGERPRINT
(来自这里)。
一种解决方案是根据其FARM_FINGERPRINT(orderId)
对每一行进行编码,这是一个来自所有INT64
数均匀分布的样本。
对于给定的k
,MOD(ABS(FARM_FINGERPRINT(orderId)),k)
构成[0,k-1]
中整数的一致分布(请注意,具有a
负数和b
正数的MOD(a,b)
可能返回负数)。
因此,假设您需要10%/90%的拆分。
对每个拆分的查询如下所示:
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),10) = 0
和
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),10) != 0
它可以推广到任意1/k拆分:
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),@k) = 0
和
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),@k) != 0
改变区分的mod整数的值(上面的0
)允许有最多k
不同的分裂(例如,如果您在ML中进行多重交叉验证,这是非常有用的)。
最后但同样重要的是:
https://stackoverflow.com/questions/50443096
复制相似问题