В Hive какой запрос лучше и почему?

Предположим, есть два запроса:

  1. select count(distinct a) from x;

  2. 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

Другие вопросы по тегам