Impala group by on分区列

时间:2015-10-22 12:00:37

标签: group-by partitioning impala

我在一些列上有一个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

1 个答案:

答案 0 :(得分:0)

这不会发生,因为事实上你使用WHERE子句限制了Impala必须执行操作的组数。

在Cloudera官方文档中,您可以找到:

  

GROUP BY在唯一或高基数列上.Impala分配一些   GROUP BY查询中每个不同值的处理程序结构。   拥有数百万个不同的GROUP BY值可能会超出内存   限制。

事实上,这篇文章是在#34;什么是内存最密集的操作?"。

此时我认为您可以与管理员交谈,并要求改善节点上的内存(但老实说,我不知道如何检查哪个节点的内存不足以进行该操作)或您可以尝试编写更智能的查询,可以使用外部表或视图。