什么是最好的查询样本从 Impala 一个巨大的数据库?

plicqrtu  于 2021-06-26  发布在  Impala
关注(0)|答案(4)|浏览(355)

我在 Impala 有一张巨大的table(超过10亿行)。我需要对100000行进行多次采样。查询样本行的最佳方法是什么?

yws3nbqq

yws3nbqq1#

回顾过去,知道tablesample不可用,可以向每个记录添加一个字段“rval”(例如,随机32位整数),并通过添加“where rval>x和rval<y”来重复采样,以获得适当的x和y值。非重叠间隔[x1,y1],[x2,y2],。。。将是独立的。您也可以使用“where rval%10000=1,=2。。。等,对于独立子集的独立总体。

sirbozc5

sirbozc52#

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

gab6jxml

gab6jxml3#

不幸的是,impala目前不支持tablesample。看到了吗https://issues.cloudera.org/browse/impala-1924 跟随它的发展。

3hvapo4f

3hvapo4f4#

正如jeff所提到的,您所要求的完全是不可能的,但是我们有一个内部聚合函数,它获取200000个样本(使用库采样)并返回样本,以逗号分隔为一行。目前还没有办法改变样本的数量。如果少于200000行,将全部返回。如果您对其工作原理感兴趣,请参阅聚合函数和水库采样结构的实现。
目前还没有一种方法来“拆分”或分解结果,所以我不知道这会有多大帮助。
例如,从一个包含8行的表中进行简单采样:

> select sample(id) from functional.alltypestiny
+------------------------+
| sample(id)             |
+------------------------+
| 0, 1, 2, 3, 4, 5, 6, 7 |
+------------------------+
Fetched 1 row(s) in 4.05s

(上下文:这是在过去的版本中添加的,以支持planner中的直方图统计,但遗憾的是,它还没有准备好。)

相关问题