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

时间:2018-05-21 06:22:38

标签: sql random google-bigquery ansi-sql

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

  • 拆分需要保持一致,不应随时间变化:这意味着每次运行查询时,拆分应保持不变。

  • 特别是,如果将数据添加到源表中,则先前位于拆分一侧的数据应保留在同一拆分中。

  • 策略应该能够处理不同的分割比率

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

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

SELECT 
   *
FROM
   `mytable`
WHERE RAND() <= 10/90
另一方面

SELECT 
   *
FROM
   `mytable`
WHERE RAND() > 10/90

但这会产生不一致的分裂。有没有办法正确实现这一目标?

1 个答案:

答案 0 :(得分:2)

解决方案是在一列上使用哈希函数,该列唯一地区分源表的每一行(例如此处为orderId)。

BigQuery有一个散列函数,其目标类型是签名INT64(以及来源STRINGBYTES):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中进行多重交叉验证,这可能非常有用)例如)。

最后但并非最不重要:

  • 折叠对于表中的数据添加是健壮的
  • 无论何时运行查询,折叠都保持不变