Использование коннектора PXF HDFS для чтения и записи текста фиксированной ширины между HDFS и Greengage DB
В этой статье описывается настройка и использование коннектора PXF HDFS для чтения и записи данных текста фиксированной ширины в HDFS с использованием внешних таблиц, а также приводятся практические примеры.
Более подробную информацию об опциях форматирования текста фиксированной ширины в Greengage DB можно получить в разделе Форматирование данных фиксированной ширины.
Создание внешней таблицы с использованием протокола PXF
Чтобы создать внешнюю таблицу Greengage DB для чтения и записи текста фиксированной ширины в HDFS, используется следующий синтаксис:
CREATE [READABLE | WRITABLE] EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION ('pxf://<path_to_data>?PROFILE=hdfs:fixedwidth[&<custom_option>=<value>[...]]')
FORMAT 'CUSTOM' (FORMATTER='fixedwidth_in | fixedwidth_out',
<field_name>='<width>' [, ...]
[, line_delim[=|<space>][E]'<delim_value>'])
[DISTRIBUTED BY (<column_name> [, ... ] ) | DISTRIBUTED RANDOMLY];
| Ключевое слово | Значение |
|---|---|
<table_name> |
Имя создаваемой таблицы |
<column_name> |
Имя создаваемого столбца |
<data_type> |
Тип данных создаваемого столбца |
LIKE <other_table> |
Указывает таблицу, из которой внешняя таблица копирует все имена столбцов, типы данных и политику распределения |
<path_to_data> |
Путь к каталогу или файлу в хранилище HDFS.
Если в конфигурации сервера |
PROFILE=hdfs:fixedwidth |
Для чтения и записи текста фиксированной ширины в HDFS используется профиль |
FORMAT 'CUSTOM' |
Для чтения и записи текста фиксированной ширины в HDFS используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения ( |
<field_name>='<width>' |
Имя и ширина поля данных, указываемая в символах.
Поля должны быть перечислены в порядке их физического следования в файле данных.
Имена полей должны совпадать с именами столбцов в команде При чтении данных, если ширина поля меньше значения |
line_delim |
Указывает символ переноса строки в файле данных, по умолчанию |
DISTRIBUTED BY |
При загрузке данных из таблицы Greengage DB во внешнюю пишущую таблицу рекомендуется указывать ту же политику распределения или имя столбца в обеих таблицах. Это позволит избежать дополнительного перемещения данных между сегментами при выполнении операции загрузки. Более подробную информацию о распределении таблиц можно получить в статье Распределение данных |
<custom_option> |
Одна из опций, описанных ниже, указываемая в строке |
SERVER=<server_name> |
Имя конфигурации сервера, который используется для доступа к данным. Если значение не указано, используется сервер PXF по умолчанию |
NEWLINE |
Если значение |
COMPRESSION_CODEC |
Кодек сжатия, используемый при записи данных: |
IGNORE_MISSING_PATH |
Действие, которое необходимо выполнить, если |
Примеры
Эти примеры демонстрируют, как настроить и использовать коннектор PXF HDFS для чтения и записи текста фиксированной ширины между Greengage DB и HDFS с использованием внешних таблиц.
Конфигурирование коннектора PXF HDFS
Для того чтобы подключиться к 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 . -
Синхронизируйте конфигурацию между хостами кластера Greengage DB:
$ pxf cluster sync
Создание читающей внешней таблицы
-
В каталоге /tmp на хосте HDFS создайте файл под названием customers.txt. В файле примера длина первого поля — 3 символа, второго — 15, третьего — 25, а последнего — 20 символов. Обратите внимание, что поля дополнены справа пробелами до требуемой ширины:
1 John Doe john.doe@example.com 123 Elm Street 2 Jane Smith jane.smith@example.com 456 Oak Street 3 Bob Brown bob.brown@example.com 789 Pine Street 4 Rob Stuart rob.stuart@example.com 119 Willow Street -
Создайте HDFS-каталог /tmp/pxf_examples для хранения файлов с тестовыми данными PXF и добавьте в HDFS созданный файл customers.txt:
$ hdfs dfs -mkdir -p /tmp/pxf_examples $ hdfs dfs -put /tmp/customers.txt /tmp/pxf_examples/ -
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на файл customers.txt. В выражении
LOCATIONукажите профильhdfs:fixedwidthи конфигурацию сервера. В выраженииFORMATукажитеfixedwidth_in— встроенную кастомную функцию форматирования для операций чтения — и перечислите поля данных и их длину:CREATE EXTERNAL TABLE customers_r ( id INTEGER, name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://tmp/pxf_examples/customers.txt?PROFILE=hdfs:fixedwidth&SERVER=hadoop') FORMAT 'CUSTOM' ( FORMATTER='fixedwidth_in', id='3', name='15', email='25', address='20'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_r;Вывод должен выглядеть следующим образом:
id | name | email | address ----+------------+------------------------+------------------- 1 | John Doe | john.doe@example.com | 123 Elm Street 2 | Jane Smith | jane.smith@example.com | 456 Oak Street 3 | Bob Brown | bob.brown@example.com | 789 Pine Street 4 | Rob Stuart | rob.stuart@example.com | 119 Willow Street (4 rows)
Создание пишущей внешней таблицы
-
На мастер-хосте Greengage DB создайте пишущую внешнюю таблицу, сохраняющую данные в HDFS-каталог /tmp/pxf_examples/customers. В выражении
LOCATIONукажите профильhdfs:fixedwidthи конфигурацию сервера. В выраженииFORMATукажитеfixedwidth_out— встроенную кастомную функцию форматирования для операций записи — и перечислите поля данных и их длину:CREATE WRITABLE EXTERNAL TABLE customers_w ( id INTEGER, name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://tmp/pxf_examples/customers?PROFILE=hdfs:fixedwidth&SERVER=hadoop') FORMAT 'CUSTOM' ( FORMATTER='fixedwidth_out', id='3', name='15', email='25', address='20'); -
Вставьте тестовые данные в таблицу
customers_w:INSERT INTO customers_w ( id, name, email, address ) VALUES (5, 'Alice Price', 'alice.price@example.com', '234 Maple Avenue'), (6, 'David Lee', 'david.lee@example.com', '567 Birch Lane'), (7, 'Emily Wilson', 'emily.wilson@example.com', '890 Cedar Court'), (8, 'Kevin Garcia', 'kevin.garcia@example.com', '123 Spruce Drive'); -
На хосте HDFS просмотрите содержимое файлов, созданных в каталоге /tmp/pxf_examples/customers:
$ hdfs dfs -cat /tmp/pxf_examples/customers/*Вывод должен выглядеть следующим образом:
8 Kevin Garcia kevin.garcia@example.com 123 Spruce Drive 5 Alice Price alice.price@example.com 234 Maple Avenue 6 David Lee david.lee@example.com 567 Birch Lane 7 Emily Wilson emily.wilson@example.com 890 Cedar Court