如何使用 Presto SQL 获得可重复的样本?

How to get repeatable sample using Presto SQL?

我正在尝试从大型 table 中获取数据样本,并希望确保以后可以重复此操作。其他 SQL 允许通过使用 set.seed(整数)或 repeatable(整数)命令设置种子来完成 repeatable 采样。但是,这在 Presto 中对我不起作用。这样的命令还不可用吗?谢谢

一种解决方案是,您可以通过添加具有随机内容(例如 UUID)的列(或创建视图)来模拟采样,然后通过对该列进行过滤来选择行(例如,UUID 以 '1 结尾').您可以调整条件以获得所需的样本量。

根据设计,结果是随机的,并且在多次运行中也是可重复的。

您可以使用选定的 ID 创建一个简单的中间体 table:

CREATE TABLE IF NOT EXISTS <temp1>
AS
SELECT <id_column>
FROM <tablename> TABLESAMPLE SYSTEM (10);

这将仅包含采样 ID,并准备好通过对感兴趣的数据执行 JOIN 以在下游分析中使用它。

如果您使用的是 Presto 0.263 或更高版本,您可以使用 key_sampling_percent 可重复地varchar 生成一个介于 0.0 和 1.0 之间的双精度值。

例如,要使用 id 列对 table 中 20% 的记录进行可重复采样:

select
    id
from table
where key_sampling_percent(id) < 0.2

如果您使用的是旧版本的 Presto(例如 AWS Athena),您可以使用 source code for key_sampling_percent:

中的内容
select
    id
from table
where (abs(from_ieee754_64(xxhash64(cast(id as varbinary)))) % 100) / 100. < 0.2