如何在Amazon Timestream中低成本获取随机数据样本?
低成本获取Timestream小时级随机数据样本的方案
针对你的问题,以下几种方法可以在控制扫描成本的同时保证样本随机性:
方法1:基于时间切片的随机采样
利用Timestream的时间分区特性,将目标小时拆分为多个小时间窗口(比如1分钟/5分钟窗口),先随机挑选若干窗口,再在每个窗口内取固定数量的数据。这种方式只扫描选中窗口的数据,大幅降低扫描量。
示例SQL(以1分钟窗口为例,随机选10个窗口,每个取100条,总计1000条):
SELECT * FROM ( -- 随机选0-59之间的分钟数作为偏移 SELECT * FROM table_name WHERE time >= from_iso8601_timestamp('2022-10-11T11:31:51') + interval '7' minute AND time < from_iso8601_timestamp('2022-10-11T11:31:51') + interval '8' minute LIMIT 100 UNION ALL SELECT * FROM table_name WHERE time >= from_iso8601_timestamp('2022-10-11T11:31:51') + interval '23' minute AND time < from_iso8601_timestamp('2022-10-11T11:31:51') + interval '24' minute LIMIT 100 -- 重复添加8个类似的随机窗口查询 ) AS sampled_data LIMIT 1000
你可以根据数据密度调整窗口大小和选中数量,比如数据稀疏时用5分钟窗口,数据密集时用30秒窗口。
方法2:用rand()过滤实现轻量随机采样
直接在WHERE子句中加入rand()过滤条件,让Timestream在扫描过程中直接筛选出随机行,避免全量数据排序的开销。这种方式扫描的是时间范围内的数据,但不需要排序,成本远低于ORDER BY random()。
示例SQL:
SELECT * FROM table_name WHERE time >= from_iso8601_timestamp('2022-10-11T11:31:51') AND time <= from_iso8601_timestamp('2022-10-11T12:31:51') AND rand() < 0.01 -- 调整该阈值控制返回数量,比如目标1000条,总数据10万则设为0.01 LIMIT 1000
注意:rand()的阈值需要根据目标小时内的预估数据总量调整,若返回数量不足,可以适当调高阈值。
方法3:随机时间点精准采样
如果数据在时间上分布均匀,可以预生成1000个目标范围内的随机时间点,查询每个时间点附近的最新/任意一条数据。这种方式单条查询扫描量极小,但依赖数据分布的均匀性。
示例SQL(单时间点示例):
SELECT * FROM table_name WHERE time >= from_iso8601_timestamp('2022-10-11T11:45:23') AND time < from_iso8601_timestamp('2022-10-11T11:45:24') LIMIT 1
将上述语句用UNION ALL拼接1000个不同的随机时间点即可。
内容的提问来源于stack exchange,提问作者dor-amberflo
相关产品推荐
相关产品推荐

