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

Что такое представление?
Представления похожи на таблицы и генерируются в соответствии с требованиями. Представление — это чисто логический объект, не имеющий собственного хранилища: 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 индекс по-прежнему действителен, но для новых задач лучше использовать один из вышеперечисленных вариантов.
