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



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

一种解决方案是,您可以通过添加包含随机内容(例如 UUID(的列(或创建视图(,然后通过筛选此列来选择行(例如,UUID 以"1"结尾(来模拟采样。您可以调整条件以获取所需的样本数量。

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

如果您使用的是 Presto 0.263 或更高版本,您可以使用key_sampling_percentvarchar重复地生成 0.0 到1.0 之间的双精度数。

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

select
id
from table
where key_sampling_percent(id) < 0.2

如果您使用的是旧版本的 Presto(例如 AWS Athena(,则可以使用源代码中的内容key_sampling_percent

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

我发现你必须使用from_big_endian_64而不是from_ieee754_64才能在雅典娜中获得可靠的结果。否则,由于负指数,我没有很多接近零的数字。

select id
from table
where (abs(from_big_endian_64(xxhash64(cast(id as varbinary)))) % 100) / 100. < 0.2

您可以使用选定的 id 创建一个简单的中间表:

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

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

相关内容

  • 没有找到相关文章