У меня есть представление, которое позволяет извлекать самые свежие данные для таблицы истории 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));
Сообщения об ошибках отсутствуют, и запрос действительно работает (фильтры для получения правильных данных), но он сканирует все разделы, поэтому он выполняется очень медленно. Как я могу ограничить запрос, чтобы использовать разделы, указанные в подзапросе?