Почему счет (отчетливый) медленнее, чем у группы в Hive?

В "Улье", я считаю, что подсчет (отчет) будет более вероятным, чем групповое, чтобы привести к несбалансированной нагрузке на редукторы и в конечном итоге привести к одному грубому редуктору. Пример запроса ниже.

Почему?

Пример запроса:

select count(distinct user)
from some_table

Версия с групповым (предлагается как быстрее):

select count(*) from
(select user
 from some_table
 group by user) q

Примечание: слайд 26 эта презентация описывает проблему.

Ответы

Ответ 1

select count(distinct user)
from some_table;

Этот запрос выполняет подсчет на стороне карты. Каждый преобразователь испускает одно значение, счетчик. Затем все значения должны быть агрегированы для получения общего количества, и это задание одного единственного редуктора.

select count(*) from
(select user
 from some_table
 group by user) q;

Этот запрос состоит из двух этапов. На этапе 1 GROUP BY объединяет пользователей на стороне карты и испускает одно значение для каждого пользователя. Вывод должен быть агрегирован на стороне уменьшения, , но он может использовать множество редукторов. На этапе 2 выполняется операция COUNT на стороне карты, а затем конечный результат агрегируется с использованием одного единственного редуктора.

Итак, если у вас очень большое количество раскосов на карте, тогда первый запрос должен будет заполнить очень большое число результатов одного значения. Второй запрос может использовать множество редукторов на стороне уменьшения уровня 1, а затем на этапе 2 будет иметь меньшую задачу для одиночного редуктора в конце.

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