在 Big Query 中从每个组中随机抽样

Taking a Random Sample From Each Group in Big Query

我正在尝试找出在 Big Query 的 table 中为每个组随机抽取 100 条记录的最佳方法。

例如,我有一个table,其中A列是唯一的recordID,B列是记录所属的groupID。对于每个不同的 groupID,我想随机抽取 100 个 recordID。有没有简单的方法来完成这个?

像下面这样的东西应该可以工作

SELECT recordID, groupID
FROM (
  SELECT 
    recordID, groupID, 
    RAND() AS rnd, ROW_NUMBER() OVER(PARTITION BY groupID ORDER BY rnd) AS pos
  FROM yourTable
)
WHERE pos <= 100
ORDER BY groupID, recordID

如果您想提高随机性,请同时检查 RAND() here

有类似的需求,即聚类抽样,超过 400M 和更多列,但在使用 ROW_NUMBER() 时遇到 Exceeded resources... 错误。

如果您不需要 RAND() 因为您的数据无论如何都是无序的,那么它的性能非常好(在我的情况下 <30s):

SELECT ARRAY_AGG(x LIMIT 100) 
FROM yourtable x 
GROUP BY groupId

您可以:

  • 如果前端无法呈现嵌套记录,则用 UNNEST() 修饰
  • 更快地将 ORDER BY groupId 添加到 find/confirm 模式