Представление Hive и индексирование: создание на примерах

⚡ Умное резюме

В Hive представления — это сохраненные запросы, которые ведут себя как таблицы только для чтения, а индексы — это указатели на столбец, которые ускоряют поиск, и оба создаются с помощью коротких операторов HiveQL, показанных здесь.

  • 👁️ Представленная точка зрения логична: Представление хранит в метаданных только оператор SELECT, поэтому оно не занимает собственного дискового пространства.
  • 🔒 Только для чтения по умолчанию: Представление не может быть целью операций LOAD, INSERT или ALTER, поскольку Hive переоценивает его при каждом запросе.
  • 📍 Указательные точки на данных: Индекс — это указатель на значение столбца, позволяющий Hive считывать часть файла, а не всю таблицу целиком.
  • 🇧🇷 Два оператора: Компактное индексирование подходит для столбцов с большим количеством уникальных значений, а битовое индексирование — для столбцов с небольшим количеством уникальных значений.
  • 🔄 Ручная пересборка: Индекс никогда не обновляется автоматически, поэтому команду ALTER INDEX REBUILD необходимо запускать после изменения базовой таблицы.
  • ???? Удалено в Hive 3.0: Индексирование было отменено в рамках HIVE-18448, и его заменили материализованные представления, хранение и разбиение на разделы в форматах ORC или Parquet.

Представления и индексы в Hive: объяснение на примерах.

Что такое представление?

Представления похожи на таблицы и генерируются в соответствии с требованиями. Представление — это чисто логический объект, не имеющий собственного хранилища: Hive хранит в метаданных только текст запроса и оценивает его каждый раз, когда используется представление.

  • Мы можем сохранить любые данные набора результатов в виде представления в Hive.
  • Использование аналогично представлениям, используемым в SQL
  • Представление доступно только для чтения, поэтому оно не может быть целью операторов LOAD, INSERT или ALTER, которые записывают данные.

Создание представления:

Синтаксис:

Create VIEW <VIEWNAME> AS SELECT

Полная документированная форма также допускает использование предложения IF NOT EXISTS и необязательного списка столбцов, что полезно, когда список SELECT содержит выражения, а не просто имена столбцов.

Пример:

Hive>Create VIEW Sample_View AS SELECT * FROM employees WHERE salary>25000

В этом примере мы создаём представление Sample_View, которое отображает все значения строк, в которых поле «зарплата» превышает 25000. Фильтр находится внутри представления, поэтому любой запрос, который выбирает данные из Sample_View, видит только эти строки.

Что такое Индекс?

Индексы — это указатели на имя конкретного столбца таблицы. Цель индекса — повысить скорость поиска: без него запрос с таким предикатом, как... ГДЕ tab1.col1 = 10 Загружает всю таблицу или раздел и обрабатывает каждую строку, в то время как индекс по столбцу col1 позволяет Hive читать только часть файла.

  • Пользователь должен вручную определить индекс
  • Везде, где мы создаем индекс, это означает, что мы создаем указатель на имя определенного столбца таблицы.
  • Любые изменения, внесенные в столбец таблицы, сохраняются с использованием индекса, созданного по имени этого столбца.

Такое ускорение не бесплатно. Создание индекса требует дополнительных вычислительных ресурсов, а сам индекс занимает дисковое пространство, которое необходимо поддерживать вместе с таблицей.

Синтаксис:

Create INDEX <INDEX_NAME> ON TABLE <TABLE_NAME(column names)>

Пример:

Create INDEX sample_Index ON TABLE guruhive_internaltable(id)

Здесь мы создаём индекс в таблице guruhive_internaltable для столбца с именем id. Обратите внимание, что в версии, которая всё ещё поддерживает индексирование, для полного выполнения запроса также требуется пункт index-handler, который подробно показан в следующем разделе.

Разница между представлением и индексом в Hive.

Представления и индексы часто вводятся вместе, поскольку оба инструмента работают поверх существующей таблицы, но решают разные задачи. Представление изменяет то, что видит запрос, а индекс изменяет скорость, с которой Hive находит таблицу. В таблице ниже приведено их сравнение.

Аспект Детали Индекс
Что оно хранит Только оператор SELECT в метаданных. Отдельная индексная таблица, содержащая указатели на данные.
Цель Упростите или ограничьте возвращаемые значения запроса. Уменьшить объем данных, сканируемых на наличие предиката.
Стоимость диска Ничто Дополнительное хранилище плюс перестройка после изменения данных.
Доступ для записи Только для чтения Запрос не поступает напрямую; оптимизатор использует его.
Текущее состояние Полностью поддерживается Удалено в Hive 3.0

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

Типы индексов в Hive с синтаксисом

В версиях Hive до 2.x включительно было два обработчика индексов, и имя обработчика указывается в обязательном пункте AS. Компактное индексирование появилось в Hive 0.7.0, а битовое индексирование — в Hive 0.8.0.

  • Краткий указатель: Этот подход сохраняет значение вместе с адресом блока HDFS, в котором оно находится, вместо записи местоположения каждого отдельного вхождения. Он подходит для столбцов с множеством различных значений.
  • Индекс растрового изображения: Для каждого уникального значения хранится битовая карта, что является обычным подходом для столбца с небольшим количеством уникальных значений, таких как флаг статуса или пола.

Компактный индекс создается, отображается в списке и удаляется следующим образом:

CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT';
SHOW INDEX ON table01;
DROP INDEX table01_index ON table01;

Опция WITH DEFERRED REBUILD регистрирует индекс без его заполнения, поэтому сборку можно запланировать отдельно с помощью ALTER INDEX. Битовый индекс создается аналогичным образом, но с другим именем обработчика:

CREATE INDEX table03_index ON TABLE table03 (column4) AS 'BITMAP' WITH DEFERRED REBUILD;
ALTER INDEX table03_index ON table03 REBUILD;
SHOW FORMATTED INDEX ON table03;
DROP INDEX table03_index ON table03;

Индекс не обновляется автоматически. При каждом поступлении новых данных в базовую таблицу необходимо повторно выполнить команду ALTER INDEX … REBUILD, а в случае секционированной таблицы перестроение может быть ограничено одной секцией.

Почему индексирование было удалено в Hive 3.0

Индексирование было удалено из Hive в версии 3.0 в рамках HIVE-18448, поэтому команды CREATE INDEX, SHOW INDEX и DROP INDEX больше не доступны в современных кластерах. После того, как столбцовое хранилище и оптимизатор на основе стоимости стали достаточно развитыми, затраты на перестроение индексов редко оправдывали себя. Три варианта замены решают ту же проблему.

  • Материализованные представления: представленный в Hive 3.0.0, материализованный вид Сохраняет предварительно вычисленный результат запроса, и оптимизатор автоматически переписывает входящие запросы, используя этот результат.
  • Столбчатые форматы файлов: ORC и Parquet используют собственные облегченные индексы и статистику минимального/максимального значений, поэтому программа для чтения может пропускать целые полосы, блоки или файлы без необходимости использования каких-либо пользовательских индексов.
  • Перегородки и контейнеры: секционирование и сегментирование Удаление данных происходит на уровне каталогов и файлов, что обычно позволяет удалить гораздо больше входных данных, чем когда-либо удавалось сделать с помощью индекса.

В Hive 2.x индекс по-прежнему действителен, но для новых задач лучше использовать один из вышеперечисленных вариантов.

Часто задаваемые вопросы (FAQ)

Команда DROP VIEW view_name удаляет представление, а ALTER VIEW view_name RENAME TO new_name переименовывает его. Поскольку представление не содержит данных, команда DROP VIEW переименовывает его.ping Базовая таблица остается неизменной; исчезает только запись в метаданных.

Материализованное представление хранит предварительно вычисленный результат запроса как реальные данные, поэтому оно занимает место на диске и требует перестроения. Обычное представление хранит только текст запроса и пересчитывается при каждом обращении к нему.

Нет. Метахранилище хранит только оператор SELECT и список разрешенных столбцов, и ничего больше. Каждая ссылка повторно выполняет базовый запрос, поэтому представление, работающее с медленным соединением, остается медленным.

В Hive 0.12.0 и более ранних версиях имена индексов были чувствительны к регистру для команд CREATE INDEX и DROP INDEX, в то время как для ALTER INDEX требовалось написание строчными буквами. В Hive 0.13.0 имена индексов стали нечувствительными к регистру для всех операторов.

Да, на любом современном кластере. Удаление разделов (partition pruning) исключает целые каталоги перед началом сканирования, а сегментирование (bucketsing) сужает область объединения или выборки до конкретных файлов, что обычно превосходит возможности индексной таблицы.

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

Он надежно генерирует операторы CREATE VIEW из короткого комментария. Проверьте все параметры, специфичные для конкретной версии, поскольку он по-прежнему генерирует синтаксис CREATE INDEX, который кластер Hive 3.0 или более поздней версии сразу же отклоняет.

Индекс представляет собой отдельную таблицу указателей, и Hive никогда не обновляет его при изменении базовой таблицы. Без перестроения указатели устаревают, поэтому оптимизатор либо пропускает индекс, либо возвращает устаревшие совпадения.

Подведем итог этой публикации следующим образом: