Ответ 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 не будет полностью выполнен). Поэтому, хотя я могу видеть некоторые аргументы в пользу вашего совета, я был бы настроен скептически, если не будет проведено надлежащее измерение и будет улучшаться.