在 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 模式
我正在尝试找出在 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 模式