我在一些列上有一个impala内部表,我希望在某些字段上执行一个分组,包括分区列,基本上我的查询看起来像这样:
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'子句中时,分区修剪确实会发生,但是当它们在'group by'时不起作用我是对的吗?如果我的假设是对的,那么它会让我感到震惊,因为分区列上的group by正在为一个hdfs子目录运行group by。
以下是我运行第一个查询时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
答案 0 :(得分:0)
这不会发生,因为事实上你使用WHERE
子句限制了Impala必须执行操作的组数。
在Cloudera官方文档中,您可以找到:
GROUP BY在唯一或高基数列上.Impala分配一些 GROUP BY查询中每个不同值的处理程序结构。 拥有数百万个不同的GROUP BY值可能会超出内存 限制。
事实上,这篇文章是在#34;什么是内存最密集的操作?"。
此时我认为您可以与管理员交谈,并要求改善节点上的内存(但老实说,我不知道如何检查哪个节点的内存不足以进行该操作)或您可以尝试编写更智能的查询,可以使用外部表或视图。