首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在BigQuery中,如何随机分割查询结果?

在BigQuery中,如何随机分割查询结果?
EN

Stack Overflow用户
提问于 2018-05-21 06:22:37
回答 1查看 2K关注 0票数 2

在BigQuery (标准SQL)中,我想从查询中随机分割结果行。

  • 拆分必须是一致的,并且不应该随着时间的推移而改变:这意味着每次运行查询时,拆分都应该保持不变。
  • 特别是,如果数据被添加到源表中,那么先前在拆分的一侧的数据应该保持在相同的拆分中。
  • 这种策略应该能够处理不同的分割比率。

例如,我目前有一个表mytable,其中有列(order_idcreated_atcountry):

一方面,10%/90%的分裂

代码语言:javascript
代码运行次数:0
运行
复制
SELECT 
   *
FROM
   `mytable`
WHERE RAND() <= 10/90

另一方面,

代码语言:javascript
代码运行次数:0
运行
复制
SELECT 
   *
FROM
   `mytable`
WHERE RAND() > 10/90

,但这会产生不一致的分割。是否有正确实现这一目标的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-21 06:22:37

解决方案是在一个列上使用散列函数,该函数唯一地区分源表的每一行(例如,这里的orderId)。

BigQuery有一个散列函数,目标类型是有符号的INT64 (以及源STRINGBYTES):FARM_FINGERPRINT (来自这里)。

一种解决方案是根据其FARM_FINGERPRINT(orderId)对每一行进行编码,这是一个来自所有INT64数均匀分布的样本。

对于给定的kMOD(ABS(FARM_FINGERPRINT(orderId)),k)构成[0,k-1]中整数的一致分布(请注意,具有a负数和b正数的MOD(a,b)可能返回负数)。

因此,假设您需要10%/90%的拆分。

对每个拆分的查询如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT 
   *
FROM
   `mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),10) = 0

代码语言:javascript
代码运行次数:0
运行
复制
SELECT 
   *
FROM
   `mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),10) != 0

它可以推广到任意1/k拆分:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT 
   *
FROM
   `mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),@k) = 0

代码语言:javascript
代码运行次数:0
运行
复制
SELECT 
   *
FROM
   `mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),@k) != 0

改变区分的mod整数的值(上面的0)允许有最多k不同的分裂(例如,如果您在ML中进行多重交叉验证,这是非常有用的)。

最后但同样重要的是:

  • 这些折叠对表中的数据添加具有很强的鲁棒性
  • 只要运行查询,这些折叠将保持不变。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50443096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档