我在 Impala 中有一个包含超过 10 亿行的巨大表。我需要对大约 100,000 行进行多次采样。查询这些示例行的最佳方法是什么?
正如 Jeff 提到的,您所要求的完全不可能,但我们确实有一个内部聚合函数,它需要 200,000 个样本(使用水库采样)并返回样本,以逗号分隔为单行。目前还没有办法改变样本数量。如果少于 200,000 行,则全部返回。如果您对其工作原理感兴趣,请参阅聚合函数和水库采样结构的实现。
目前还没有办法“拆分”或分解结果,所以我不知道这会有多大帮助。
例如,从 8 行的表中进行简单采样:
> select sample(id) from functional.alltypestiny
+------------------------+
| sample(id) |
+------------------------+
| 0, 1, 2, 3, 4, 5, 6, 7 |
+------------------------+
Fetched 1 row(s) in 4.05s
(对于上下文:这是在过去的版本中添加的,以支持规划器中的直方图统计,不幸的是尚未准备好。)
不幸的是,Impala 目前不支持 TABLESAMPLE。请参阅 https://issues.cloudera.org/browse/IMPALA-1924 以跟踪其发展。
回想起来,知道 TABLESAMPLE 不可用,可以向每个记录添加一个字段“RVAL”(例如,随机 32 位整数),并通过添加“where RVAL > x and RVAL < y", for appropriate values of x and y. Non-overlapping intervals [x1,y1], [x2,y2],... will be independent. You can also select using "where RVAL%10000 = 1, =2, ... etc, for a separate population of independent subsets.
”来重复采样其他答案中提到的 TABLESAMPLE 现在可在较新版本的 impala (>=2.9.0) 中使用,请参阅文档。
以下是如何使用它对 1% 的数据进行采样的示例:
SELECT foo FROM huge_table TABLESAMPLE SYSTEM(1)
或
SELECT bar FROM huge_table TABLESAMPLE SYSTEM(1) WHERE name='john'
看起来
percentage
参数必须是整数,所以你可以采取的最小样本限制为1%。
请记住,表中采样数据的比例无法保证,可能会大于指定的百分比(在本例中大于 1%)。 Impala 的文档对此进行了更详细的解释。
如果您正在寻找某些列的样本,您可以检查下面的答案。
假设您有全局数据,并且希望从中随机选取 10% 并创建数据集。您也可以使用列的任意组合 - 例如城市、邮政编码和州。
select * from
(
select
row_number() over (partition by country order by country , random()) rn,
count() over (partition by country order by country) cntpartition,
tab.*
from dat.mytable tab
)rs
where rs.rn between 1 and cntpartition* 10/100 -- This is for 10% data