我在 Impala 有一张巨大的table(超过10亿行)。我需要对100000行进行多次采样。查询样本行的最佳方法是什么?
yws3nbqq1#
回顾过去,知道tablesample不可用,可以向每个记录添加一个字段“rval”(例如,随机32位整数),并通过添加“where rval>x和rval<y”来重复采样,以获得适当的x和y值。非重叠间隔[x1,y1],[x2,y2],。。。将是独立的。您也可以使用“where rval%10000=1,=2。。。等,对于独立子集的独立总体。
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 的文档中有更详细的解释。
percentage
gab6jxml3#
不幸的是,impala目前不支持tablesample。看到了吗https://issues.cloudera.org/browse/impala-1924 跟随它的发展。
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中的直方图统计,但遗憾的是,它还没有准备好。)
4条答案
按热度按时间yws3nbqq1#
回顾过去,知道tablesample不可用,可以向每个记录添加一个字段“rval”(例如,随机32位整数),并通过添加“where rval>x和rval<y”来重复采样,以获得适当的x和y值。非重叠间隔[x1,y1],[x2,y2],。。。将是独立的。您也可以使用“where rval%10000=1,=2。。。等,对于独立子集的独立总体。
sirbozc52#
其他答案中提到的tablesample现在在impala的较新版本(>=2.9.0)中可用,请参阅文档。
下面是一个示例,说明如何使用它对1%的数据进行采样:
或
看起来像
percentage
参数必须是整数,因此可以获取的最小示例限制为1%。请记住,表中抽样数据的比例不一定是确定的,并且可能大于规定的百分比(在这种情况下大于1%)。这在 Impala 的文档中有更详细的解释。
gab6jxml3#
不幸的是,impala目前不支持tablesample。看到了吗https://issues.cloudera.org/browse/impala-1924 跟随它的发展。
3hvapo4f4#
正如jeff所提到的,您所要求的完全是不可能的,但是我们有一个内部聚合函数,它获取200000个样本(使用库采样)并返回样本,以逗号分隔为一行。目前还没有办法改变样本的数量。如果少于200000行,将全部返回。如果您对其工作原理感兴趣,请参阅聚合函数和水库采样结构的实现。
目前还没有一种方法来“拆分”或分解结果,所以我不知道这会有多大帮助。
例如,从一个包含8行的表中进行简单采样:
(上下文:这是在过去的版本中添加的,以支持planner中的直方图统计,但遗憾的是,它还没有准备好。)