已分区列上的impala group by

qncylg1j  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(444)

我有一个impala内部表,它在一些列上进行了分区,我想在一些字段(包括分区列)上执行group by,基本上我的查询如下所示:

select market, col1, count(1) from mytable group by market, col1

“市场”是划分栏。
然后我得到“超出内存限制”,但是如果我发出这样的查询:

select market, col1, count(1) from mytable where market='US' group by market, col1

然后我得到了没有记忆问题的结果。
所以在我看来,在impala中,当分区列位于'where'子句中时,分区修剪确实会发生,但当它们位于'groupby'中时,分区修剪就不起作用了,对吗?如果我的假设是正确的,那么我会感到震惊,因为分区列上的groupby只是为hdfs子目录运行groupby。
以下是我运行第一个查询时impala配置文件消息的开头:

Estimated Per-Host Requirements: Memory=7.59TB VCores=2

F02:PLAN FRAGMENT [UNPARTITIONED]   04:EXCHANGE [UNPARTITIONED]
     hosts=39 per-host-mem=unavailable
     tuple-ids=1 row-size=133B cardinality=28530506252

F01:PLAN FRAGMENT [HASH(market,col1)] DATASTREAM SINK [FRAGMENT=F02, EXCHANGE=04, UNPARTITIONED]   03:AGGREGATE [FINALIZE]   |  output: count:merge(1)   |  group by: market, col1   |  hosts=39 per-host-mem=3.80TB   |  tuple-ids=1 row-size=133B cardinality=28530506252   |   02:EXCHANGE [HASH(market,col1)]
     hosts=39 per-host-mem=0B
     tuple-ids=1 row-size=133B cardinality=28530506252

F00:PLAN FRAGMENT [RANDOM]   DATASTREAM SINK [FRAGMENT=F01, EXCHANGE=02, HASH(market,col1)] 01:AGGREGATE   |  output: count(1)   |  group by: market, col1   |  hosts=39 per-host-mem=3.80TB   |  tuple-ids=1 row-size=133B cardinality=28530506252   |   00:SCAN HDFS [mytable, RANDOM]
 partitions=5057/5057 files=5397 size=207.71GB
 table stats: 28530506252 rows total
 column stats: all
 hosts=39 per-host-mem=384.00MB
 tuple-ids=0 row-size=125B cardinality=28530506252
tcomlyy6

tcomlyy61#

它不会发生,因为使用 WHERE 实际上,您限制了impala必须对其执行操作的组的数量。
在cloudera官方文档中,您可以发现:
group by位于唯一或高基数列上。impala为group by查询中的每个不同值分配一些处理程序结构。拥有数百万个不同的分组值可能会超过内存限制。
事实上,这段文档被放在了“什么是内存最密集的操作”一节中。
在这一点上,我认为您可以与管理员交谈,并要求改进节点上的内存(但老实说,我不知道如何检查哪些节点的内存不足,以便执行该操作),或者您可以尝试编写一个更智能的查询,可以使用外部表或视图。

相关问题