В Hive какой запрос лучше и почему?
Предположим, есть два запроса:
select count(distinct a) from x;
select count(*) from (select distinct a from x) y;
Я знаю, что они дают одинаковые результаты, но с точки зрения Hive
(с помощью MapReduce
). Кто-нибудь может объяснить, какой из них лучше и почему?
Любая помощь приветствуется.
2 ответа
В версиях Hive до 1.2.0 первый запрос выполняется с использованием одной стадии Map и одной стадии Reduce. Карта отправляет каждое значение одному редуктору, а редуктор выполняет всю работу.
Один редуктор обрабатывает слишком много данных в этом случае.
Во время выполнения второго запроса выходные данные сопоставителей распределяются между многими редукторами, каждый редуктор генерирует свой отдельный список, а последнее задание сопоставления с картами суммирует размер каждого списка.
Начиная с Hive 1.2.0, Hive 1.2.0+ обеспечивает оптимизацию автоматического перезаписи. hive.optimize.distinct.rewrite=true/false
см. HIVE-10568
Смотрите также сообщество Hortonworks
2-й запрос: выберите количество (*) из (выберите отличное от x) y;
до 3.x быстрее, чем
1-й запрос: выберите количество (отличное а) от x;
Пожалуйста, обратитесь к https://issues.apache.org/jira/browse/HIVE-10568
Выполнены оба запроса в Hive, первый запрос выполнен в 1 этап с 1 редуктором.
MapReduce Jobs Launched:
Stage-Stage-1: Map: 3 Reduce: 1 Cumulative CPU: 46.51 sec HDFS Read: 42857 HDFS Write: 4 SUCCESS
Total MapReduce CPU Time Spent: 46 seconds 510 msec
Второй запрос выполняется в 2 этапа с улучшенным параллелизмом.
MapReduce Jobs Launched:
Stage-Stage-1: Map: 3 Reduce: 1 Cumulative CPU: 13.93 sec HDFS Read: 42857 HDFS Write: 115 SUCCESS
Stage-Stage-2: Map: 1 Reduce: 1 Cumulative CPU: 5.83 sec HDFS Read: 510 HDFS Write: 4 SUCCESS
Total MapReduce CPU Time Spent: 19 seconds 760 msec