繁体   English   中英

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

[英]How to get repeatable sample using Presto SQL?

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

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

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

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

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

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

如果您使用 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才能在 Athena 中获得可靠的结果。 否则,由于负指数,我没有很多接近零的数字。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM