AWS RedShift 采样

Aws RedShift sampling

为了进行数据质量检查,我需要在特定时间间隔内收集数据。 有些桌子很大。

有没有什么技巧可以在不影响性能的情况下做到这一点?

喜欢select随机100行。

你需要多随机?执行此操作的经典方法是使用“WHERE RANDOM() < .001”。如果你需要它来给你一个 repeatable “随机”集,那么你可以添加一个种子。问题是你的 table 很大,这意味着从磁盘读取(扫描)每一行只是为了扔掉其中的大部分,因为 table 扫描可能需要很长时间,这不是你想要的想做。

因此,您可能希望利用 Redshift“有限 table 扫描”功能作为“随机”采样的一部分。 (从磁盘读取最快的数据是你不从磁盘读取的数据。)这里的问题是这个解决方案将取决于你的 table 排序键和排序,这将把解决方案推向甚至“更伪" 随机区域(不是真正的随机抽样)。在许多情况下,这没什么大不了的,但如果统计数据真的很重要,那么这可能对你不起作用。

这是通过基于排序键对“块”而不是行进行采样来完成的。这种块采样可以随机完成,每个数据块将代表大约 250K 行(基于排序键数据类型、压缩等,范围可以从 <100K 行到 2M 行)。执行此过程需要对 STV_BLOCKLIST 进行一些检查。 Redshift 的存储量是 1MB 块,系统中每个块的元数据都可以在 STV_BLOCKLIST 中引用。该系统 table 包含每个块的最小值和最大值。首先找到相关 table 的排序键的所有块。接下来选择这些块的随机样本(如果您仍在处理大量数据,请确保此样本从所有切片中选择偶数以避免执行偏差)。

现在的诀窍是将这些最小和最大元数据值转换为执行所需采样的 WHERE 子句。这些最小值和最大值是 BIGINT,并且是从排序键列中的数据散列得出的。此散列依赖于数据类型。如果数据类型是 BIGINT 那么 has 就非常简单——如果数据类型是 timestamp 那么它就有点复杂了。但是对于所涉及的数据类型,排序将在散列函数中保留。对这个哈希进行逆向工程并不难 - 只需进行一些实验 - 但如果你告诉我所涉及的类型,我可以提供帮助,因为此时我已经对几乎所有数据类型进行了此操作。

您甚至可以在此块的随机抽样之上进行随机抽样行。或者,如果您愿意,您可以只选择一些窄范围的排序键值,然后随机抽样行并避免所有这些逆向工程业务。这个想法是使用 Redshift 的“减少扫描”功能来大大减少从磁盘读取的数据量。为此,您需要在选择采样 windows 时了解元数据,这通常意味着排序键 where 子句。这就是了解数据库引擎的工作原理并利用其功能为您带来优势。

我知道这个答案是基于一些未说明的信息,所以如果有什么不清楚的地方,请在评论中联系我们。