Группа 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

Тогда я получаю свой результат без проблем с памятью.

Мне кажется, что в импале обрезка разделов действительно происходит, когда столбцы разделения находятся в предложениях where, но не работает, когда они находятся в группе group by, я прав? Если мое предположение верно, то это меня шокирует, поскольку group by в столбце разделения просто запускает group by для подкаталога hdfs.

Вот начало сообщения профиля импала, когда я запускаю свой первый запрос:

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

person Xintong Bian    schedule 22.10.2015    source источник


Ответы (1)


Этого не происходит, потому что, используя предложение WHERE, вы фактически ограничиваете количество групп, с которыми Impala должна выполнять операции.

В официальной документации Cloudera вы можете найти следующее:

GROUP BY для уникального столбца или столбца с высоким числом элементов. IMPALA выделяет несколько структур обработчиков для каждого значения в запросе GROUP BY. Наличие миллионов различных значений GROUP BY может превысить лимит памяти.

Фактически, часть документации находится в разделе «Какие операции с наибольшим объемом памяти?».

На этом этапе я думаю, что вы можете поговорить с администраторами и попросить улучшить память на узле (ах) (но, честно говоря, я понятия не имею, как проверить, на каком узле (ах) не хватает памяти для этой операции), или вы можете попробовать чтобы написать более умный запрос, возможно, используя внешнюю таблицу или представление.

person SabDeM    schedule 22.10.2015