对于大型数据库,从 Impala 采样的最佳查询是啥?

Posted

技术标签:

【中文标题】对于大型数据库,从 Impala 采样的最佳查询是啥?【英文标题】:What is the best query to sample from Impala for a huge database?对于大型数据库,从 Impala 采样的最佳查询是什么? 【发布时间】:2015-07-20 16:40:41 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

很遗憾,Impala 目前不支持 TABLESAMPLE。请参阅https://issues.cloudera.org/browse/IMPALA-1924 了解其发展情况。

【讨论】:

【参考方案3】:

回想起来,知道 TABLESAMPLE 不可用,可以为每条记录添加一个字段“RVAL”(例如,随机 32 位整数),并通过添加“where RVAL > x and RVAL

【讨论】:

【参考方案4】:

其他答案中提到的 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%。

请记住,表中的抽样数据比例并不能保证,并且可能大于指定的百分比(在这种情况下大于 1%)。这在 Impala 的文档中有更详细的解释。

【讨论】:

这不起作用。当我使用 SYSTEM(1) 参数时。结果大约是原始数据集的 %7.4 而不是 %1。看起来像是随机抽样。 @math_law 那你为什么不赞成我的回答呢?以这种方式实施不是我的错。如果您阅读 Impala 的文档,您会发现不能保证百分比数字是准确的。无论如何,我修改了我的答案并添加了一个警告其他人的条款。【参考方案5】:

如果您正在寻找某些列的样本,您可以查看以下答案。 比如说,你有全局数据,你想从它们中随机选择 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()

【讨论】:

以上是关于对于大型数据库,从 Impala 采样的最佳查询是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从大型数据集中过滤掉记录的最佳方法是什么

从大型数据集中采样

Netezza/大型数据库的采样数据技术

Impala 通过 JDBC 流式传输真的很慢

为本地开发采样一个大型 CouchDB 数据库,避免长视图构建

从大型数据集重新采样的 Diff-in-diff 估计