Хобрук: Ваш путь к мастерству в программировании

Hive: есть ли улучшение производительности при использовании предложения where в подтаблицах перед объединением?

Я хочу присоединиться к 2 таблицам кустов. Есть ли разница в производительности между следующими операторами?

Столбцы для basic_info: user_id, имя, фамилия, день рождения, род занятий

Столбцы для account_info: user_id, account_id, тип, баланс

Запрос1:

SELECT b.user_id, a.account_id, b.name, b.lastname, a.balance
FROM account_info a
JOIN basic_info b
   ON a.user_id = b.user_id
WHERE b.occupation = 'lawyer'

Запрос2:

SELECT b.user_id, a.account_id, b.name, b.lastname, a.balance
FROM account_info a
JOIN 
   (SELECT user_id, name, lastname 
    FROM basic_info
    WHERE occupation = 'lawyer') b
   ON a.user_id = b.user_id

Для меня 2-й выглядит более производительным. Но я не смог найти очевидного утверждения, говорящего об этом. Самое близкое, что я нашел на веб-сайте Apache, было:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

Соединения происходят ДО WHERE CLAUSES. Итак, если вы хотите ограничить ВЫВОД объединения, требование должно быть в предложении WHERE, в противном случае оно должно быть в предложении JOIN. Большой путаницей в этом вопросе являются секционированные таблицы.

Но приведенный пример был для разделов, а не для этого случая. Есть ли официальный документ, предполагающий, что Query 2 лучше или нет?


  • Каково время выполнения обоих запросов? Это должен быть измеримый способ ответить на ваш вопрос. 26.10.2016
  • В современной реляционной базе данных, такой как mysql или oracle, эти два запроса должны генерировать точно такой же план выполнения. Обычно выбор происходит до соединения. Я не уверен насчет Хайва. Лучше всего попытаться увидеть фактические планы выполнения. 26.10.2016

Ответы:


1

Да, Query-2 должен работать быстро. Как вы упомянули, объединение происходит перед предложением where.

Но на ваш вопрос об официальном документе: в Hive есть опция Predicate push down. По умолчанию для этого параметра установлено значение false. Его можно установить в true, используя

установить hive.optimize.ppd=true;

Когда для этой опции установлено значение true, соединение происходит после предложения where. В вашем случае, если вы установите для этого свойства значение «Истина», оба ваших запроса должны завершиться одновременно. Когда для свойства установлено значение false (поведение по умолчанию), запрос 2 должен завершиться быстро.

Поскольку HIVE имеет явное свойство для предиката, мы можем сделать вывод, что соединение происходит перед предложением where, когда для свойства установлено значение false.

26.10.2016
  • Предикативная отправка включена по умолчанию для возрастов. . 15.05.2017

  • 2

    Есть несколько способов написать этот sql. Хотя ваши оба запроса возвращают один и тот же результат, но внутренний план выполнения отличается, и он может иметь значительную разницу во времени выполнения.
    Команда Hive explain хороша точки, чтобы начать с отладки и понимания плана выполнения запроса за кулисами. Я надеюсь, что команда объяснения поможет вам понять разницу между обеими командами.

    Другие факторы, Hive соединения карты и SMB( Sort-Merge-Bucket) повысить эффективность соединений.

    26.10.2016
    Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..