我正在尝试从 Athena 获取
N
行的随机样本。但由于我想从中绘制这个样本的表格很大,所以天真
SELECT
id
FROM mytable
ORDER BY RANDOM()
LIMIT 100
需要永远运行,大概是因为
ORDER BY
要求将所有数据发送到单个节点,然后该节点对数据进行洗牌和排序。
TABLESAMPLE
但这允许人们对一定百分比的行而不是一定数量的行进行采样。有更好的方法吗?
Athena 实际上落后于 Presto。您可以使用 TABLESAMPLE 获取表的随机样本。
假设您想要表的 10% 样本,您的查询将类似于:
SELECT id FROM mytable TABLESAMPLE BERNOULLI(10)
注意有BERNOULLI和SYSTEM采样。 这里是它的文档。
使用 TABLESAMPLE 的最佳答案非常有效,但有一个小警告:结果表的行按照与原始表相同的顺序排序。
本页上的原始问题(以及我本人)似乎希望新表具有随机排序的行。我在最后实现了一个小的额外子句:
SELECT id FROM mytable TABLESAMPLE BERNOULLI(10) ORDER BY random()