从 Impala 对大型数据库进行采样的最佳查询是什么?

问题描述 投票:0回答:5

我在 Impala 中有一个包含超过 10 亿行的巨大表。我需要对大约 100,000 行进行多次采样。查询这些示例行的最佳方法是什么?

random impala nosql
5个回答
2
投票

正如 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

(对于上下文:这是在过去的版本中添加的,以支持规划器中的直方图统计,不幸的是尚未准备好。)


1
投票

不幸的是,Impala 目前不支持 TABLESAMPLE。请参阅 https://issues.cloudera.org/browse/IMPALA-1924 以跟踪其发展。


1
投票

回想起来,知道 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.

”来重复采样

1
投票

其他答案中提到的 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 的文档对此进行了更详细的解释。


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

链接- 使用 random() 或 tablesample system() 在 impala 中随机采样 n 行

© www.soinside.com 2019 - 2024. All rights reserved.