Hive не использует разделы в запросе

У меня есть представление, которое позволяет извлекать самые свежие данные для таблицы истории Hive. Таблица истории разбита по дням. Представление работает очень просто - в нем есть подзапрос, который устанавливает максимальную дату в поле даты (которое используется в качестве раздела), а затем фильтрует таблицу на основе этого значения. Таблица содержит сотни дней (разделов), в каждой из которых много миллионов строк. Чтобы ускорить выполнение подзапроса, я пытаюсь ограничить сканируемые разделы до последнего созданного. Чтобы учесть праздничные выходные, я возвращаюсь на четыре дня назад, чтобы убедиться, что запрос возвращает данные.

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

Однако, если я попытаюсь ограничить разделы с помощью подзапроса для вычисления последнего раздела, он не распознает разделы и выполнит полное сканирование таблицы. Запрос вернет правильные результаты, поскольку фильтр работает, но это занимает много времени, поскольку не ограничивает проверяемые разделы.

Я попытался выполнить подзапрос как оператор WITH, а затем использовать INNER JOIN на bus_date, но получил те же результаты - разделы не использовались.

Поведение можно повторить с помощью запроса, поэтому я буду использовать его, а не представление, чтобы продемонстрировать:

SELECT *
  FROM a.transactions
 WHERE bus_date IN (SELECT MAX (bus_date)
                      FROM a.transactions maxtrans
                     WHERE bus_date >= date_sub (CURRENT_DATE, 4));

Сообщения об ошибках отсутствуют, и запрос действительно работает (фильтры для получения правильных данных), но он сканирует все разделы, поэтому он выполняется очень медленно. Как я могу ограничить запрос, чтобы использовать разделы, указанные в подзапросе?


person Jeff E    schedule 11.09.2019    source источник
comment
Прочтите эти связанные ответы: stackoverflow.com/a/56940800/2700344 и это stackoverflow.com/a/56963448/2700344 и этот stackoverflow.com/a / 53279839/2700344   -  person leftjoin    schedule 12.09.2019
comment
Я попробую. Спасибо!   -  person Jeff E    schedule 13.09.2019
comment
Это интересная, но не совсем та же проблема. Похоже, что Hive не будет сокращать разделы, если критерий where в столбце раздела поступает из подзапроса.   -  person Jeff E    schedule 16.09.2019
comment
Вам нужно передать результат подзапроса в качестве параметра, как показано выше в ссылке ... Я тестировал то же самое для Spark sql. stackoverflow.com/questions/40663066/   -  person vikrant rana    schedule 17.09.2019
comment
Викрант, похоже, это невозможно сделать только с помощью Hive SQL. Мне нужно поставить это на место для просмотра. Это возможно?   -  person Jeff E    schedule 18.09.2019


Ответы (1)


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

SELECT * FROM a.transactions WHERE bus_date >= date_sub (CURRENT_DATE, 4) AND bus_date IN (SELECT MAX (bus_date) FROM a.transactions maxtrans WHERE bus_date >= date_sub (CURRENT_DATE, 4));

Запрос немного неуклюжий, так как он дважды фильтруется по деловой дате. В первый раз он ограничивает основной набор данных последними четырьмя днями (что ограничивает эти разделы и позволяет избежать сканирования всех разделов), а второй раз фиксирует его до последнего дня, за который были загружены данные (через MAX bus_date ). Это далеко не идеально, но работает ЗНАЧИТЕЛЬНО лучше, чем запрос, проверяющий все разделы. Спасибо.

person Jeff E    schedule 17.09.2019