在BigQuery(标准SQL)中,我想从查询中随机分割结果行。
拆分需要保持一致,不应随时间变化:这意味着每次运行查询时,拆分应保持不变。
特别是,如果将数据添加到源表中,则先前位于拆分一侧的数据应保留在同一拆分中。
策略应该能够处理不同的分割比率
例如,我目前有一个表mytable
,其中包含列(order_id
,created_at
,country
):
一方面是10%/ 90%的分裂
SELECT
*
FROM
`mytable`
WHERE RAND() <= 10/90
另一方面
SELECT
*
FROM
`mytable`
WHERE RAND() > 10/90
但这会产生不一致的分裂。有没有办法正确实现这一目标?
答案 0 :(得分:2)
解决方案是在一列上使用哈希函数,该列唯一地区分源表的每一行(例如此处为orderId
)。
BigQuery有一个散列函数,其目标类型是签名INT64
(以及来源STRING
或BYTES
):FARM_FINGERPRINT
(来自here)。< / p>
解决方案是根据FARM_FINGERPRINT(orderId)
对每一行进行编码,INT64
是所有k
数字均匀分布的样本。
对于给定的MOD(ABS(FARM_FINGERPRINT(orderId)),k)
,[0,k-1]
构成了MOD(a,b)
中整数的统一分布(警惕a
b
为负,SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),10) = 0
} positive可能会返回一个负数。)
因此,假设您需要10%/ 90%的分割。
每个分组的查询如下所示:
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),10) != 0
和
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),@k) = 0
可以推广到任何1 / k分割:
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),@k) != 0
和
0
更改上述判别模式整数(k
)的值允许最多let onlinesRef = Database.database().reference().child("RSVP").child("yourchild name")
个不同的拆分(如果您在ML中进行多重交叉验证,这可能非常有用)例如)。
最后但并非最不重要: