从Impala中为大型数据库提供样本的最佳查询是什么?

时间:2015-07-20 16:40:41

标签: random impala nosql

我在Impala中拥有一张巨大的桌子(超过10亿行)。我需要多次采样~100,000行。查询样本行的最佳方法是什么?

5 个答案:

答案 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()