我在Impala中拥有一张巨大的桌子(超过10亿行)。我需要多次采样~100,000行。查询样本行的最佳方法是什么?
答案 0 :(得分:2)
正如Jeff所提到的那样,你所要求的完全不可能,但我们确实有一个内部聚合函数,需要200,000个样本(使用水库采样)并返回样本,逗号分隔为一排。目前还没有办法改变样本数量。如果行数少于200,000,则将返回所有行。如果您对此工作原理感兴趣,请参阅implementation of the aggregate function and reservoir sampling structures。
没有办法分开'或者爆炸结果,所以我不知道这会有多大帮助。
例如,从具有8行的表中简单地进行采样:
> select sample(id) from functional.alltypestiny
+------------------------+
| sample(id) |
+------------------------+
| 0, 1, 2, 3, 4, 5, 6, 7 |
+------------------------+
Fetched 1 row(s) in 4.05s
(对于上下文:这是在过去的版本中添加的,以支持规划器中的直方图统计,但遗憾的是还没有准备好。)
答案 1 :(得分:0)
不幸的是,Impala目前不支持TABLESAMPLE。请参阅https://issues.cloudera.org/browse/IMPALA-1924以了解其发展情况。
答案 2 :(得分:0)
回想起来,知道TABLESAMPLE不可用,可以为每条记录添加一个字段“RVAL”(例如随机的32位整数),并通过添加“where RVAL> x和RVAL< y”重复采样“,适用于x和y的值。非重叠区间[x1,y1],[x2,y2],......将是独立的。您还可以选择使用“其中RVAL%10000 = 1,= 2,...等,用于单独的独立子集群。
答案 3 :(得分:0)
其他答案中提到的TABLESAMPLE现在可以在较新版本的impala(> = 2.9.0)中使用,请参见documentation。
下面是一个示例,说明如何使用它来采样1%的数据:
SELECT foo FROM huge_table TABLESAMPLE SYSTEM(1)
或
SELECT bar FROM huge_table TABLESAMPLE SYSTEM(1) WHERE name='john'
类似percentage
的参数必须是整数,因此可以采用的最小样本数限制为1%。
答案 4 :(得分:0)
如果您正在寻找某些列的样本,您可以查看以下答案。
假设你有全局数据,你想从它们中随机挑选 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
链接 - Randomly sampling n rows in impala using random() or tablesample system()