【发布时间】:2021-07-05 16:09:04
【问题描述】:
我想使用 Impala 从表中随机抽取 n 行。我可以想到两种方法来做到这一点,即:
SELECT * FROM TABLE ORDER BY RANDOM() LIMIT <n>
或
SELECT * FROM TABLE TABLESAMPLE SYSTEM(1) limit <n>
在我的例子中,我将 n 设置为 10000,并从超过 2000 万行的表中进行抽样。如果我理解正确,第一个选项本质上为每行创建一个介于 0 和 1 之间的随机数,并按此随机数排序。 第二个选项创建许多不同的“桶”,然后随机抽取至少 1% 的数据(实际上这似乎总是比提供的百分比大得多)。在这两种情况下,我只选择前 10000 行。
在我的案例中,随机抽样 10K 行的第一个选项可靠吗?
编辑:一些额外的上下文。数据的结构就是为什么整个表的随机抽样或洗牌对我来说似乎很重要。每天都会向表中添加额外的行。例如,其中一列是country,通常传入的行首先来自国家 A,然后来自国家 B,等等。因此,我担心第二个选项可能会从一个单一的行中采样太多行国家,而不是随机的。这是一个合理的担忧吗?
揭示第二个选项的相关线程:What is the best query to sample from Impala for a huge database?
【问题讨论】:
-
如果您有像您想要处理的国家/地区这样的名义分布,请尝试进行分层抽样而不是纯随机抽样。