我正在尝试从一个大表中获取数据样本,并希望确保以后可以重复此操作。其他 SQL 允许通过使用 set.seed(整数( 或可重复(整数(命令设置种子来完成可重复的采样。但是,这在普雷斯托对我不起作用。这样的命令还不可用吗?谢谢。
一种解决方案是,您可以通过添加包含随机内容(例如 UUID(的列(或创建视图(,然后通过筛选此列来选择行(例如,UUID 以"1"结尾(来模拟采样。您可以调整条件以获取所需的样本数量。
根据设计,结果是随机的,也可以在多次运行中重复。
如果您使用的是 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
才能在雅典娜中获得可靠的结果。否则,由于负指数,我没有很多接近零的数字。
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
,在分析的下游使用它。