[英]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_percent
从varchar
可重现地生成 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.