Использование коннекторов PXF Hive для чтения данных из таблиц Hive в Greengage DB
- Форматы данных Hive
- Сопоставление типов данных
- Сканирование партиций
- Создание внешней таблицы с использованием протокола PXF
- Примеры
- Конфигурирование коннектора PXF Hive
- Создание тестового набора данных
- Использование профиля hive
- Использование профиля hive:text
- Использование профиля hive:rc
- Использование профиля hive:orc
- Доступ к Hive-таблицам формата Parquet
- Доступ к Hive-таблицам формата Avro
- Доступ к Hive-таблицам формата SequenceFile
- Чтение составных типов данных
- Доступ к однородным партиционированным данным
- Доступ к разнородным партиционированным данным
- Доступ к партиции Hive по умолчанию
Apache Hive — инфраструктура для распределенного хранилища данных. Hive облегчает управление большими наборами данных, поддерживая несколько форматов, включая TextFile — значения, разделенные запятыми (CSV), RCFile, ORC и Parquet.
В этой статье описывается настройка и использование коннектора PXF Hive для чтения данных из таблиц Hive с использованием внешних таблиц, а также приводятся практические примеры.
При обращении к Hive 3 коннектор PXF Hive поддерживает использование профилей hive[:*], описанных ниже, только для доступа к внешним таблицам Hive 3.
Использование профилей hive[:*] для обращения к управляемым таблицам Hive 3 (CRUD и с транзакциями insert-only, а также временным таблицам) не поддерживается.
Для доступа к управляемым таблицам Hive 3 используйте коннектор PXF JDBC.
Форматы данных Hive
Для доступа к данным различных форматов в таблицах Hive коннектор PXF Hive предоставляет профили hive, hive:text, hive:rc и hive:orc.
| Формат файла | Профиль | Описание |
|---|---|---|
TextFile |
hive, hive:text |
Неструктурированные файлы со значениями, разделенными запятыми, символами табуляции или пробелами, а также в нотации JSON. См. пример в разделе Использование профиля hive:text |
RCFile |
hive, hive:rc |
Колоночные данные с бинарными парами ключ/значение, высокая степень сжатия строк. См. пример в разделе Использование профиля hive:rc |
ORC |
hive, hive:orc |
Оптимизированный колоночный формат данных с секциями stripe, footer и postscript; обеспечивает сокращение размера файла. Профиль
Если при создании внешней таблицы указан параметр
См. примеры в разделах Использование профиля hive:orc и Чтение составных типов данных |
Parquet |
hive |
Сжатый формат данных с колоночным хранением. См. пример в разделе Доступ к Hive-таблицам формата Parquet |
Avro |
hive |
Фреймворк сериализации данных с двоичным форматом данных. См. пример в разделе Доступ к Hive-таблицам формата Avro |
SequenceFile |
hive |
Неструктурированный файл со значениями, состоящими из бинарных пар ключ/значение. См. пример в разделе Доступ к Hive-таблицам формата SequenceFile |
Любой поддерживаемый формат файла |
hive |
Оптимальный профиль |
При использовании профилей hive, hive:rc или hive:orc PXF использует проекцию столбцов для увеличения производительности запроса.
Сопоставление типов данных
Коннектор PXF Hive поддерживает примитивные и составные типы данных. Составные типы данных — массивы, структуры, ассоциативные массивы и объединения — сопоставляются текстовому типу. Для извлечения подкомпонентов составного типа данных вы можете использовать как средства БД (пользовательские функции (UDF)), так и программный код на стороне клиента.
Для примитивных типов данных используется следующее сопоставление.
| Тип данных Hive | Тип данных Greengage DB |
|---|---|
boolean |
BOOL |
int |
INT4 |
smallint |
INT2 |
tinyint |
INT2 |
bigint |
INT8 |
float |
FLOAT4 |
double |
FLOAT8 |
string |
TEXT |
binary |
BYTEA |
timestamp (1) |
TIMESTAMP |
Сканирование партиций
Коннектор PXF Hive поддерживает сканирование партиций и структуру каталогов партиций.
Сканирование партиций позволяет исключить из запроса выбранные файлы HDFS, составляющие таблицу Hive, и уменьшить объем сетевого трафика и нагрузку на систему ввода-вывода.
Для использования сканирования партиций выполните запрос к внешней таблице с использованием условия WHERE, которое ссылается на столбец партиционирования таблицы Hive.
См. примеры в разделах Доступ к разнородным партиционированным данным и Доступ к однородным партиционированным данным.
В PXF поддерживается сканирование партиций Hive для строковых и целочисленных типов:
-
Реляционные операторы
=,<,<=,>,>=и<>поддерживаются для строковых типов. -
Реляционные операторы
=и<>поддерживаются для целочисленных типов. Для использования сканирования партиций с целочисленными типами Hive, необходимо обновить конфигурацию Hive, как описано в разделе Конфигурирование коннектора PXF Hive. -
Логические операторы
ANDиORподдерживаются при использовании реляционных операторов, перечисленных выше. -
Строковый оператор
LIKEне поддерживается.
Для использования сканирования партиций требуется, чтобы имена столбцов партиционирования Hive и PXF совпадали. В противном случае сканирование партиций игнорируется и фильтрация выполняется на стороне Greengage DB.
Коннектор PXF Hive производит фильтрацию только по столбцам партиционирования, но не каким-либо иным атрибутам таблицы. Фильтрация включена по умолчанию и поддерживается только для типов данных и операторов, перечисленных выше. Более подробную информацию о фильтрации можно получить в разделе Pushdown фильтров документации PXF.
Если в Hive включено динамическое партиционирование, данные партиционированной таблицы могут храниться в партиции по умолчанию. Hive создает партицию по умолчанию, когда значение столбца партиционирования не совпадает с определенным типом столбца (например, когда для любого столбца партиционирования используется NULL).
В таких случаях результаты запросов из Hive и PXF могут отличаться.
В Hive любой запрос, включающий фильтр по столбцу партиционирования, исключает данные, хранящиеся в партиции по умолчанию.
PXF, как и Hive, представляет столбцы партиционирования таблицы как столбцы, добавляемые в конец таблицы.
Но в PXF любое значение столбца в партиции по умолчанию переводится в NULL.
Это означает, что запрос Greengage DB, включающий фильтр IS NULL по столбцу партиционирования, может возвращать результаты, отличные от результатов Hive.
См. пример в разделе Доступ к партиции Hive по умолчанию.
Создание внешней таблицы с использованием протокола PXF
Таблицы Hive могут храниться в одном или нескольких файлах, каждый из которых имеет уникальную структуру или схему, поэтому имена столбцов в таблице Greengage DB должны совпадать с именами столбцов таблицы Hive. Прямое сопоставление по имени столбцов позволяет:
-
Создавать внешние таблицы со столбцами в ином порядке, чем в таблице Hive.
-
Создавать внешние таблицы, содержащие только часть столбцов таблицы Hive.
-
Читать данные таблицы Hive из файлов с другим количеством столбцов.
Чтобы создать внешнюю таблицу Greengage DB для чтения данных из таблицы Hive, используется следующий синтаксис:
CREATE EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION ('pxf://<hive_db_name>.<hive_table_name>?PROFILE=<profile_name>[&<custom_option>=<value>[...]]')
FORMAT 'CUSTOM|TEXT' (FORMATTER='pxfwritable_import' | delimiter='<delim>');
| Ключевое слово | Значение |
|---|---|
<table_name> |
Имя создаваемой таблицы |
<column_name> |
Имя создаваемого столбца |
<data_type> |
Тип данных создаваемого столбца |
LIKE <other_table> |
Указывает таблицу, из которой внешняя таблица копирует все имена столбцов, типы данных и политику распределения |
<hive_db_name> |
Имя базы данных Hive.
Если значение не указано, используется база данных Hive по умолчанию |
<hive_table_name> |
Имя таблицы Hive |
PROFILE=<profile_name> |
Для чтения данных из таблицы Hive используется один из следующих профилей: |
<custom_option> |
Одна из опций, описанных ниже, указываемая в строке |
SERVER=<server_name> |
Имя конфигурации сервера, который используется для доступа к данным. Если значение не указано, используется сервер PXF по умолчанию |
PPD=<boolean> |
Включает pushdown предикатов для всех запросов к этой таблице.
Применяется только к профилям |
VECTORIZE=<boolean> |
Для профиля |
FORMAT (профили |
Для чтения данных из таблицы HBase используется кастомный формат со встроенной кастомной функцией форматирования для операций чтения ( |
FORMAT (профили |
Для чтения данных из таблицы HBase используется формат |
Примеры
Эти примеры демонстрируют, как настроить и использовать коннектор PXF Hive для чтения данных из Hive в Greengage DB с использованием внешних таблиц.
Конфигурирование коннектора PXF Hive
Для того чтобы подключиться к HDFS с помощью PXF, необходимо создать конфигурацию сервера, как описано в статье Настройка коннекторов PXF Hadoop документации PXF, а затем синхронизировать конфигурацию между хостами кластера Greengage DB:
-
Подключитесь к мастер-хосту Greengage DB как
gpadmin. -
Перейдите в каталог $PXF_BASE/servers и создайте каталог конфигурации сервера Hadoop с именем hadoop:
$ mkdir $PXF_BASE/servers/hadoop $ cd $PXF_BASE/servers/hadoop -
Скопируйте файлы конфигурации core-site.xml, hdfs-site.xml, mapred-site.xml и yarn-site.xml с хоста NameNode кластера Hadoop на текущий хост:
$ scp hdfsuser@namenode:/etc/hadoop/conf/core-site.xml . $ scp hdfsuser@namenode:/etc/hadoop/conf/hdfs-site.xml . $ scp hdfsuser@namenode:/etc/hadoop/conf/mapred-site.xml . $ scp hdfsuser@namenode:/etc/hadoop/conf/yarn-site.xml . -
Если вы планируете использовать pushdown предикатов с целочисленными типами Hive, убедитесь, что в конфигурации Hive hive-site.xml создан параметр конфигурации
hive.metastore.integral.jdo.pushdownи ему присвоено значениеtrue. Затем скопируйте файл hive-site.xml с хоста NameNode кластера Hadoop на текущий хост:$ scp hdfsuser@namenode:/etc/hbase/conf/hive-site.xml . -
Синхронизируйте конфигурацию между хостами кластера Greengage DB:
$ pxf cluster sync
Создание тестового набора данных
-
В каталоге /tmp на хосте HiveServer создайте текстовый файл customers.txt, содержимое которого — значения, разделенные запятыми:
John Doe,24,152.12 Jane Smith,66,456.72 Bob Brown,12,51.19 Rob Stuart,42,34.81
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive
customersдля хранения тестового набора данных. ВыражениеFIELDS TERMINATED BYустанавливает запятую (,) в качестве разделителя полей внутри записи данных (строки). ВыражениеSTORED AS TEXTFILEуказывает, что таблица создается в форматеTEXTFILE(по умолчанию):CREATE TABLE customers ( name STRING, orders INT, sales DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; -
Загрузите файл customers.txt в созданную таблицу
customers:LOAD DATA LOCAL INPATH '/tmp/customers.txt' INTO TABLE customers; -
Опционально, выполните запрос к таблице
customers, чтобы убедиться, что данные загружены:SELECT * FROM customers;Вывод должен выглядеть следующим образом:
+-----------------+-------------------+------------------+ | customers.name | customers.orders | customers.sales | +-----------------+-------------------+------------------+ | John Doe | 24 | 152.12 | | Jane Smith | 66 | 456.72 | | Bob Brown | 12 | 51.19 | | Rob Stuart | 42 | 34.81 | +-----------------+-------------------+------------------+ 4 rows selected (0.079 seconds)
-
С помощью команды
DESCRIBE EXTENDEDможно просмотреть местоположение таблицы в HDFS:DESCRIBE EXTENDED customers;В выводе команды местоположение таблицы в HDFS указано в поле
location:... location:hdfs://hadoop/apps/hive/warehouse/customers ...
Использование профиля hive
Перед началом убедитесь, что вы создали тестовый набор данных, как описано в разделе Создание тестового набора данных.
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers. В выраженииLOCATIONукажите PXF-профильhiveи конфигурацию сервера. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_hive ( name TEXT, orders INT, sales FLOAT ) LOCATION ('pxf://default.customers?PROFILE=hive&SERVER=hadoop') FORMAT 'custom' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_hive;Вывод должен выглядеть следующим образом:
name | orders | sales ------------+--------+-------- John Doe | 24 | 152.12 Jane Smith | 66 | 456.72 Bob Brown | 12 | 51.19 Rob Stuart | 42 | 34.81 (4 rows)
Использование профиля hive:text
Перед началом убедитесь, что вы создали тестовый набор данных, как описано в разделе Создание тестового набора данных.
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers. В выраженииLOCATIONукажите PXF-профильhive:textи конфигурацию сервера. В выраженииFORMATукажитеTEXTв качестве формата данных и установите символ запятой (,) в качестве разделителя (delimiter):CREATE EXTERNAL TABLE customers_text ( name TEXT, orders INT, sales FLOAT ) LOCATION ('pxf://default.customers?PROFILE=hive:text&SERVER=hadoop') FORMAT 'TEXT' (delimiter=E','); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_text;Вывод должен выглядеть следующим образом:
name | orders | sales ------------+--------+-------- John Doe | 24 | 152.12 Jane Smith | 66 | 456.72 Bob Brown | 12 | 51.19 Rob Stuart | 42 | 34.81 (4 rows)
Использование профиля hive:rc
Перед началом убедитесь, что вы создали тестовый набор данных, как описано в разделе Создание тестового набора данных.
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive, хранящуюся в формате RCFile:
CREATE TABLE customers_rc ( name STRING, orders INT, sales DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS RCFILE; -
Скопируйте данные из таблицы
customersв таблицуcustomers_rc, чтобы сохранить их в формате RCFile:INSERT INTO TABLE customers_rc SELECT * FROM customers; -
Опционально, выполните запрос к Hive-таблице
customers_rc, чтобы убедиться, что данные загружены:SELECT * FROM customers_rc;Вывод должен выглядеть следующим образом:
+--------------------+----------------------+---------------------+ | customers_rc.name | customers_rc.orders | customers_rc.sales | +--------------------+----------------------+---------------------+ | John Doe | 24 | 152.12 | | Jane Smith | 66 | 456.72 | | Bob Brown | 12 | 51.19 | | Rob Stuart | 42 | 34.81 | +--------------------+----------------------+---------------------+ 4 rows selected (0.1 seconds)
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers_rc. В выраженииLOCATIONукажите PXF-профильhive:rcи конфигурацию сервера. В выраженииFORMATукажитеTEXTв качестве формата данных и установите символ запятой (,) в качестве разделителя (delimiter):CREATE EXTERNAL TABLE customers_rc ( name TEXT, orders INT, sales FLOAT ) LOCATION ('pxf://default.customers_rc?PROFILE=hive:rc&SERVER=hadoop') FORMAT 'TEXT' (delimiter=E','); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_rc;Вывод должен выглядеть следующим образом:
name | orders | sales ------------+--------+-------- John Doe | 24 | 152.12 Jane Smith | 66 | 456.72 Bob Brown | 12 | 51.19 Rob Stuart | 42 | 34.81 (4 rows)
Использование профиля hive:orc
Перед началом убедитесь, что вы создали тестовый набор данных, как описано в разделе Создание тестового набора данных.
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive, хранящуюся в формате ORC:
CREATE TABLE customers_orc ( name STRING, orders INT, sales DOUBLE ) STORED AS ORC; -
Скопируйте данные из таблицы
customersв таблицуcustomers_orc, чтобы сохранить их в формате ORC:INSERT INTO TABLE customers_orc SELECT * FROM customers; -
Опционально, выполните запрос к Hive-таблице
customers_orc, чтобы убедиться, что данные загружены:SELECT * FROM customers_orc;Вывод должен выглядеть следующим образом:
+---------------------+-----------------------+----------------------+ | customers_orc.name | customers_orc.orders | customers_orc.sales | +---------------------+-----------------------+----------------------+ | John Doe | 24 | 152.12 | | Jane Smith | 66 | 456.72 | | Bob Brown | 12 | 51.19 | | Rob Stuart | 42 | 34.81 | +---------------------+-----------------------+----------------------+ 4 rows selected (0.095 seconds)
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers_orc. В выраженииLOCATIONукажите PXF-профильhive:orcи конфигурацию сервера. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_orc ( name TEXT, orders INT, sales FLOAT ) LOCATION ('pxf://default.customers_orc?PROFILE=hive:orc&SERVER=hadoop') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_orc;Вывод должен выглядеть следующим образом:
name | orders | sales ------------+--------+-------- John Doe | 24 | 152.12 Jane Smith | 66 | 456.72 Bob Brown | 12 | 51.19 Rob Stuart | 42 | 34.81 (4 rows)
Доступ к Hive-таблицам формата Parquet
Перед началом убедитесь, что вы создали тестовый набор данных, как описано в разделе Создание тестового набора данных.
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive, хранящуюся в формате Parquet:
CREATE TABLE customers_parquet ( name STRING, orders INT, sales DOUBLE ) STORED AS PARQUET; -
Скопируйте данные из таблицы
customersв таблицуcustomers_parquet, чтобы сохранить их в формате Parquet:INSERT INTO TABLE customers_parquet SELECT * FROM customers; -
Опционально, выполните запрос к Hive-таблице
customers_parquet, чтобы проверить данные:SELECT * FROM customers_parquet;Вывод должен выглядеть следующим образом:
+-------------------------+---------------------------+--------------------------+ | customers_parquet.name | customers_parquet.orders | customers_parquet.sales | +-------------------------+---------------------------+--------------------------+ | John Doe | 24 | 152.12 | | Jane Smith | 66 | 456.72 | | Bob Brown | 12 | 51.19 | | Rob Stuart | 42 | 34.81 | +-------------------------+---------------------------+--------------------------+ 4 rows selected (0.1 seconds)
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers_parquet. В выраженииLOCATIONукажите PXF-профильhiveи конфигурацию сервера. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_parquet ( name TEXT, orders INT, sales FLOAT ) LOCATION ('pxf://default.customers_parquet?PROFILE=hive&SERVER=hadoop') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_parquet;Вывод должен выглядеть следующим образом:
name | orders | sales ------------+--------+-------- John Doe | 24 | 152.12 Jane Smith | 66 | 456.72 Bob Brown | 12 | 51.19 Rob Stuart | 42 | 34.81 (4 rows)
Доступ к Hive-таблицам формата Avro
Перед началом убедитесь, что вы создали тестовый набор данных, как описано в разделе Создание тестового набора данных.
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive, хранящуюся в формате Avro:
CREATE TABLE customers_avro ( name STRING, orders INT, sales DOUBLE ) STORED AS AVRO; -
Скопируйте данные из таблицы
customersв таблицуcustomers_avro, чтобы сохранить их в формате Avro:INSERT INTO TABLE customers_avro SELECT * FROM customers; -
Опционально, выполните запрос к Hive-таблице
customers_avro, чтобы проверить данные:SELECT * FROM customers_avro;Вывод должен выглядеть следующим образом:
+----------------------+------------------------+-----------------------+ | customers_avro.name | customers_avro.orders | customers_avro.sales | +----------------------+------------------------+-----------------------+ | John Doe | 24 | 152.12 | | Jane Smith | 66 | 456.72 | | Bob Brown | 12 | 51.19 | | Rob Stuart | 42 | 34.81 | +----------------------+------------------------+-----------------------+ 4 rows selected (0.198 seconds)
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers_avro. В выраженииLOCATIONукажите PXF-профильhiveи конфигурацию сервера. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_avro ( name TEXT, orders INT, sales FLOAT ) LOCATION ('pxf://default.customers_avro?PROFILE=hive&SERVER=hadoop') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_avro;Вывод должен выглядеть следующим образом:
name | orders | sales ------------+--------+-------- John Doe | 24 | 152.12 Jane Smith | 66 | 456.72 Bob Brown | 12 | 51.19 Rob Stuart | 42 | 34.81 (4 rows)
Доступ к Hive-таблицам формата SequenceFile
Перед началом убедитесь, что вы создали тестовый набор данных, как описано в разделе Создание тестового набора данных.
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive, хранящуюся в формате SequenceFile:
CREATE TABLE customers_seqfile ( name STRING, orders INT, sales DOUBLE ) STORED AS SEQUENCEFILE; -
Скопируйте данные из таблицы
customersв таблицуcustomers_seqfile, чтобы сохранить их в формате SequenceFile:INSERT INTO TABLE customers_seqfile SELECT * FROM customers; -
Опционально, выполните запрос к Hive-таблице
customers_seqfile, чтобы проверить данные:SELECT * FROM customers_seqfile;Вывод должен выглядеть следующим образом:
+-------------------------+---------------------------+--------------------------+ | customers_seqfile.name | customers_seqfile.orders | customers_seqfile.sales | +-------------------------+---------------------------+--------------------------+ | John Doe | 24 | 152.12 | | Jane Smith | 66 | 456.72 | | Bob Brown | 12 | 51.19 | | Rob Stuart | 42 | 34.81 | +-------------------------+---------------------------+--------------------------+ 4 rows selected (0.086 seconds)
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers_orc. В выраженииLOCATIONукажите PXF-профильhive:orcи конфигурацию сервера. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_seqfile ( name TEXT, orders INT, sales FLOAT ) LOCATION ('pxf://default.customers_seqfile?PROFILE=hive&SERVER=hadoop') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_seqfile;Вывод должен выглядеть следующим образом:
name | orders | sales ------------+--------+-------- John Doe | 24 | 152.12 Jane Smith | 66 | 456.72 Bob Brown | 12 | 51.19 Rob Stuart | 42 | 34.81 (4 rows)
Чтение составных типов данных
-
В каталоге /tmp на хосте HiveServer создайте текстовый файл customers_complex.txt. При определении массива в таблице Hive требуется указать символ-разделитель для каждого из его компонентов, а также для каждого ключа в ассоциативном массиве. Файл customers_complex.txt использует запятую (
,) для разделения значений полей, знак процента (%) для разделения компонентов коллекции, а двоеточие (:) для отделения ключей ассоциативного массива:John Doe,1%2%3,tier:gold%subscription:active%referrals:6 Jane Smith,4%5%6,tier:silver%subscription:active Bob Brown,7%8%9,tier:bronze%subscription:inactive%referrals:4 Rob Stuart,0%1%2,tier:gold%subscription:active%referrals:2
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive
customers_cдля хранения тестового набора данных. ВыражениеSTORED AS TEXTFILEуказывает, что таблица создается в форматеTEXTFILE(по умолчанию). ВыражениеFIELDS TERMINATED BYустанавливает запятую (,) в качестве разделителя полей внутри записи данных (строки). ВыражениеCOLLECTION ITEMS TERMINATED BYустанавливает знак процента (%) в качестве разделителя компонентов коллекции. ВыражениеMAP KEYS TERMINATED BYустанавливает двоеточие (:) для отделения ключей ассоциативного массива:CREATE TABLE customers_c ( name STRING, metrics ARRAY<int>, status MAP<string, string> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '%' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE; -
Загрузите файл customers_complex.txt в созданную таблицу
customers_c:LOAD DATA LOCAL INPATH '/tmp/customers_complex.txt' INTO TABLE customers_c; -
Создайте таблицу Hive, хранящуюся в формате ORC:
CREATE TABLE customers_c_orc ( name STRING, metrics ARRAY<int>, status MAP<string, string> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '%' MAP KEYS TERMINATED BY ':' STORED AS ORC; -
Скопируйте данные из таблицы
customers_cв таблицуcustomers_c_orc, чтобы сохранить их в формате ORC:INSERT INTO TABLE customers_c_orc SELECT * FROM customers_c; -
Опционально, выполните запрос к Hive-таблице
customers_c_orc, чтобы убедиться, что данные загружены:SELECT * FROM customers_c_orc;Вывод должен выглядеть следующим образом:
+-----------------------+--------------------------+-------------------------------------------------------------+ | customers_c_orc.name | customers_c_orc.metrics | customers_c_orc.status | +-----------------------+--------------------------+-------------------------------------------------------------+ | John Doe | [1,2,3] | {"tier":"gold","subscription":"active","referrals":"6"} | | Jane Smith | [4,5,6] | {"tier":"silver","subscription":"active"} | | Bob Brown | [7,8,9] | {"tier":"bronze","subscription":"inactive","referrals":"4"} | | Rob Stuart | [0,1,2] | {"tier":"gold","subscription":"active","referrals":"2"} | +-----------------------+--------------------------+-------------------------------------------------------------+ 4 rows selected (0.082 seconds) -
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers_c_orc. В выраженииLOCATIONукажите PXF-профильhive:orcи конфигурацию сервера. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_c_orc ( name TEXT, metrics TEXT, status TEXT ) LOCATION ('pxf://default.customers_c_orc?PROFILE=hive:orc&SERVER=hadoop') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_c_orc;В выводе поля
metricsиstatusсериализованы как текстовые строки:name | metrics | status ------------+---------+------------------------------------------------------------- John Doe | [1,2,3] | {"tier":"gold","subscription":"active","referrals":"6"} Jane Smith | [4,5,6] | {"tier":"silver","subscription":"active"} Bob Brown | [7,8,9] | {"tier":"bronze","subscription":"inactive","referrals":"4"} Rob Stuart | [0,1,2] | {"tier":"gold","subscription":"active","referrals":"2"} (4 rows)
Доступ к однородным партиционированным данным
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive с двумя столбцами партиционирования,
stateиcity:CREATE TABLE customers_part ( name STRING, sales DOUBLE ) PARTITIONED BY (state string, city string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -
Загрузите тестовые данные в созданную таблицу, партиционировав ее по полям
stateиcity:INSERT INTO TABLE customers_part PARTITION(state = 'California', city = 'Fresno') VALUES ('John Doe', 150.00); INSERT INTO TABLE customers_part PARTITION(state = 'California', city = 'Sacramento') VALUES ('Jane Smith', 175.50); INSERT INTO TABLE customers_part PARTITION(state = 'Nevada', city = 'Reno') VALUES ('Bob Brown', 200.75); INSERT INTO TABLE customers_part PARTITION(state = 'Nevada', city = 'Las Vegas') VALUES ('Rob Stuart', 180.20); -
Выполните запрос к таблице
customers_part:SELECT * FROM customers_part;В выводе столбцы партиционирования добавлены в конце каждой записи:
+----------------------+-----------------------+-----------------------+----------------------+ | customers_part.name | customers_part.sales | customers_part.state | customers_part.city | +----------------------+-----------------------+-----------------------+----------------------+ | John Doe | 150.0 | California | Fresno | | Jane Smith | 175.5 | California | Sacramento | | Rob Stuart | 180.2 | Nevada | Las Vegas | | Bob Brown | 200.75 | Nevada | Reno | +----------------------+-----------------------+-----------------------+----------------------+ 4 rows selected (0.127 seconds)
-
Просмотрите структуру каталогов Hive-таблицы
customers_partв HDFS:$ hdfs dfs -ls -C -R /apps/hive/warehouse/customers_partВывод должен выглядеть следующим образом:
/apps/hive/warehouse/customers_part/state=California /apps/hive/warehouse/customers_part/state=California/city=Fresno /apps/hive/warehouse/customers_part/state=California/city=Fresno/000000_0 /apps/hive/warehouse/customers_part/state=California/city=Sacramento /apps/hive/warehouse/customers_part/state=California/city=Sacramento/000000_0 /apps/hive/warehouse/customers_part/state=Nevada /apps/hive/warehouse/customers_part/state=Nevada/city=Las Vegas /apps/hive/warehouse/customers_part/state=Nevada/city=Las Vegas/000000_0 /apps/hive/warehouse/customers_part/state=Nevada/city=Reno /apps/hive/warehouse/customers_part/state=Nevada/city=Reno/000000_0
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers_part. Чтобы использовать pushdown предикатов, определите столбцыstateиcity, соответствующие столбцам партиционирования Hive-таблицы. В выраженииLOCATIONукажите PXF-профильhiveи конфигурацию сервера. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_part ( name TEXT, sales FLOAT, state TEXT, city TEXT ) LOCATION ('pxf://default.customers_part?PROFILE=hive&SERVER=hadoop') FORMAT 'custom' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_part;Вывод должен выглядеть следующим образом:
name | sales | state | city ------------+--------+------------+------------ Jane Smith | 175.5 | California | Sacramento Rob Stuart | 180.2 | Nevada | Las Vegas John Doe | 150 | California | Fresno Bob Brown | 200.75 | Nevada | Reno (4 rows)
-
Выполните запрос к созданной внешней таблице
customers_part, возвращающий записи, где значениеstateравноNevada, а значениеsalesбольше 170. Фильтр наsalesне передается в Hive, поскольку столбец не является столбцом партиционирования. Фильтрация выполняется на стороне Greengage DB после того, как все данные партицииNevadaпереданы для обработки:SELECT * FROM customers_part where state = 'Nevada' and sales > 170;Вывод должен выглядеть следующим образом:
name | sales | state | city ------------+--------+--------+----------- Rob Stuart | 180.2 | Nevada | Las Vegas Bob Brown | 200.75 | Nevada | Reno (2 rows)
-
Выполните запрос к созданной внешней таблице
customers_part, возвращающий записи, где значениеstateравноCalifornia. Фильтр наstateпередается в Hive, поскольку столбец является столбцом партиционирования. Фильтрация выполняется на стороне Hive до того, как все данные партицииCaliforniaпереданы для обработки:SELECT * FROM customers_part where state = 'California';Вывод должен выглядеть следующим образом:
name | sales | state | city ------------+-------+------------+------------ John Doe | 150 | California | Fresno Jane Smith | 175.5 | California | Sacramento (2 rows)
Доступ к разнородным партиционированным данным
Перед началом убедитесь, что вы создали тестовый набор данных, как описано в разделе Создание тестового набора данных, а также его копию в формате RCfile, как описано в разделе Использование профиля hive:rc.
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive, ссылающуюся на файлы данных Hive-таблиц
customersиcustomers_rc. Таблица партиционирована по строковому полюyear:CREATE EXTERNAL TABLE customers_part_m ( name STRING, orders INT, sales DOUBLE ) PARTITIONED BY (year string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -
Выполните команду
DESCRIBE EXTENDEDна таблицахcustomersиcustomers_rc, чтобы увидеть расположение файлов данных в HDFS для каждой таблицы:DESCRIBE EXTENDED customers; DESCRIBE EXTENDED customers_rc;В выводе команды местоположение таблиц в HDFS указано в поле
location:... location:hdfs://hadoop/apps/hive/warehouse/customers location:hdfs://hadoop/apps/hive/warehouse/customers_rc ...
-
В таблице
customers_part_mсоздайте партиции, ссылающиеся на местоположения файлов данных таблицcustomersиcustomers_rc:ALTER TABLE customers_part_m ADD PARTITION (year = '2025') LOCATION 'hdfs://hadoop/apps/hive/warehouse/customers'; ALTER TABLE customers_part_m ADD PARTITION (year = '2026') LOCATION 'hdfs://hadoop/apps/hive/warehouse/customers_rc'; -
Тип хранения таблицы
customersне указан, поэтому по умолчанию используетсяTEXTFILE. Для таблицыcustomers_rcявно укажите формат файла, используемого партицией:ALTER TABLE customers_part_m PARTITION (year='2026') SET FILEFORMAT RCFILE; -
Просмотрите созданные партиции:
SHOW PARTITIONS customers_part_m;Вывод должен выглядеть следующим образом:
+------------+ | partition | +------------+ | year=2025 | | year=2026 | +------------+ 2 rows selected
-
Выполните запрос к созданной Hive-таблице:
SELECT * FROM customers_part_m;Вывод должен выглядеть следующим образом:
+------------------------+--------------------------+-------------------------+------------------------+ | customers_part_m.name | customers_part_m.orders | customers_part_m.sales | customers_part_m.year | +------------------------+--------------------------+-------------------------+------------------------+ | John Doe | 24 | 152.12 | 2025 | | Jane Smith | 66 | 456.72 | 2025 | | Bob Brown | 12 | 51.19 | 2025 | | Rob Stuart | 42 | 34.81 | 2025 | | John Doe | 24 | 152.12 | 2026 | | Jane Smith | 66 | 456.72 | 2026 | | Bob Brown | 12 | 51.19 | 2026 | | Rob Stuart | 42 | 34.81 | 2026 | +------------------------+--------------------------+-------------------------+------------------------+ 8 rows selected (0.135 seconds)
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers_part_m. В выраженииLOCATIONукажите PXF-профильhiveи конфигурацию сервера. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_part_m ( name TEXT, orders INT, sales FLOAT, year TEXT ) LOCATION ('pxf://default.customers_part_m?PROFILE=hive&SERVER=hadoop') FORMAT 'custom' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_part_m;Вывод должен выглядеть следующим образом:
name | orders | sales | year ------------+--------+--------+------ John Doe | 24 | 152.12 | 2026 Jane Smith | 66 | 456.72 | 2026 Bob Brown | 12 | 51.19 | 2026 Rob Stuart | 42 | 34.81 | 2026 John Doe | 24 | 152.12 | 2025 Jane Smith | 66 | 456.72 | 2025 Bob Brown | 12 | 51.19 | 2025 Rob Stuart | 42 | 34.81 | 2025 (8 rows)
-
Выполните запрос к внешней таблице, возвращающий сумму значений в столбце
salesи значениемyear, равным2025:SELECT sum(sales) FROM customers_part_m where year = '2025';Вывод должен выглядеть следующим образом:
sum -------- 694.84 (1 row)
Доступ к партиции Hive по умолчанию
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive с именем
customers_part_d, партиционированной по строковому полюyear:CREATE TABLE customers_part_d ( name STRING, orders INT, sales DOUBLE ) PARTITIONED BY (year string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -
Загрузите тестовые данные в созданную таблицу. Обратите внимание, что в третьей строке опущено выражение
PARTITIONи не указано значение столбца партиционированияyear:INSERT INTO TABLE customers_part_d PARTITION(year = 2025) VALUES ('John Doe', 30, 150.00); INSERT INTO TABLE customers_part_d PARTITION(year = 2025) VALUES ('Jane Smith', 28, 175.50); INSERT INTO TABLE customers_part_d VALUES ('Bob Brown', 42, 200.75, NULL); INSERT INTO TABLE customers_part_d PARTITION(year = 2025) VALUES ('Rob Stuart', 35, 180.20); -
Выполните запрос к таблице
customers_part_d:SELECT * FROM customers_part_d;Вывод должен выглядеть следующим образом. Обратите внимание, что в столбце партиционирования
yearдля значения NULL возвращается__HIVE_DEFAULT_PARTITION__:+------------------------+--------------------------+-------------------------+-----------------------------+ | customers_part_d.name | customers_part_d.orders | customers_part_d.sales | customers_part_d.year | +------------------------+--------------------------+-------------------------+-----------------------------+ | John Doe | 30 | 150.0 | 2025 | | Jane Smith | 28 | 175.5 | 2025 | | Rob Stuart | 35 | 180.2 | 2025 | | Bob Brown | 42 | 200.75 | __HIVE_DEFAULT_PARTITION__ | +------------------------+--------------------------+-------------------------+-----------------------------+ 4 rows selected (0.112 seconds)
-
Выполните запрос к таблице
customers_part_d, фильтрующий данные по столбцу партиционированияyear:SELECT * FROM customers_part_d WHERE year IS NULL;В выводе не должно быть строк, так как данные, хранящиеся в партиции по умолчанию, исключены:
+------------------------+--------------------------+-------------------------+------------------------+ | customers_part_d.name | customers_part_d.orders | customers_part_d.sales | customers_part_d.year | +------------------------+--------------------------+-------------------------+------------------------+ +------------------------+--------------------------+-------------------------+------------------------+ No rows selected (0.165 seconds)
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на Hive-таблицу
customers_part_d. В выраженииLOCATIONукажите PXF-профильhiveи конфигурацию сервера. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_part_d ( name TEXT, orders INT, sales FLOAT, year TEXT ) LOCATION ('pxf://default.customers_part_d?PROFILE=hive&SERVER=hadoop') FORMAT 'custom' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_part_d;Вывод должен выглядеть следующим образом:
name | orders | sales | year ------------+--------+--------+------ Jane Smith | 28 | 175.5 | 2025 Bob Brown | 42 | 200.75 | Rob Stuart | 35 | 180.2 | 2025 John Doe | 30 | 150 | 2025 (4 rows)
-
Выполните запрос к созданной таблице, фильтрующий данные по столбцу партиционирования
year:SELECT * FROM customers_part_d WHERE year IS NULL;Так как все значения партиции по умолчанию переводятся в фактические значения NULL, запрос возвращает одну строку:
name | orders | sales | year -----------+--------+--------+------ Bob Brown | 42 | 200.75 | (1 row)