Использование коннектора PXF HDFS для чтения и записи текстовых данных между Greengage DB и HDFS
Эти примеры демонстрируют, как настроить и использовать коннектор 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
Создание внешней таблицы PXF с использованием протокола PXF
Для создания внешней таблицы Greengage DB, ссылающейся на текстовый файл или каталог в HDFS, используется следующий синтаксис:
CREATE [READABLE | WRITABLE] EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION ('pxf://<path-to-hdfs>?PROFILE=<profile_name>[&<custom_option>[...]]')
FORMAT '[TEXT|CSV]' (delimiter[=|<space>][E]'<delim_value>')
[DISTRIBUTED BY (<column_name> [, ... ] ) | DISTRIBUTED RANDOMLY];
| Ключевое слово | Описание |
|---|---|
<path‑to‑hdfs> |
Путь к каталогу или файлу в хранилище HDFS.
Если в конфигурации сервера PXF поддерживает чтение и запись текстовых файлов, сжатых с использованием кодека по умолчанию, а также bzip2 и gzip.
В случае читающих таблиц распаковка выполняется автоматически.
В случае пишущих внешних таблиц вы можете указать кодек и тип компрессии с помощью опций |
PROFILE=<profile_name> |
Используйте профиль |
FORMAT <value> |
Формат данных: |
delimiter |
Символ, использующийся в качестве разделителя.
Для формата Обратите внимание, что опция |
DISTRIBUTED BY |
При загрузке данных из таблицы Greengage DB во внешнюю пишущую таблицу рекомендуется указывать ту же политику распределения или имя столбца в обеих таблицах. Это позволит избежать дополнительного перемещения данных между сегментами при выполнении операции загрузки. Более подробную информацию о распределении таблиц можно получить в статье Распределение данных |
<custom_option> |
Одна из опций, описанных ниже, указываемая в строке |
SERVER=<server_name> |
Имя конфигурации сервера, который используется для доступа к данным. Если значение не указано, используется сервер PXF по умолчанию |
IGNORE_MISSING_PATH=<boolean> |
Действие, которое необходимо выполнить, если |
SKIP_HEADER_COUNT=<numlines> |
Количество строк заголовков, которые необходимо пропустить в начале файла HDFS перед чтением данных.
Значение по умолчанию — |
COMPRESSION_CODEC |
Кодек сжатия для использования при записи данных: |
COMPRESSION_TYPE |
Тип сжатия для использования при записи данных: на уровне записи ( |
Чтение простых текстовых данных из HDFS
-
В каталоге /tmp на хосте HDFS создайте текстовый файл с разделителями под названием customers.txt и со следующим содержимым:
id,first_name,last_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
-
Выполните сжатие созданного файла:
$ gzip /tmp/customers.txt -
Создайте HDFS-каталог pxf_examples для хранения файлов примеров и поместите файл customers.txt.gz в HDFS:
$ hdfs dfs -mkdir -p /tmp/pxf_examples $ hdfs dfs -put /tmp/customers.txt.gz /tmp/pxf_examples/ -
Опционально, просмотрите содержимое файла customers.txt.gz, сохраненного в HDFS:
$ hdfs dfs -text /tmp/pxf_examples/customers.txt.gz -
На мастер-хосте Greengage DB создайте читающую внешнюю таблицу PXF, ссылающуюся на файл customers.txt.gz. В выражении
LOCATIONукажите PXF-профильhdfs:textи конфигурацию сервера. Включите пропуск заголовка с помощью опцииSKIP_HEADER_COUNT. В выраженииFORMATукажитеTEXTв качестве формата данных, а символ запятой (,) — в качестве разделителя (delimiter):CREATE EXTERNAL TABLE customers_plain ( id INTEGER, first_name VARCHAR(50), last_name VARCHAR(50), email VARCHAR(100), address VARCHAR(255) ) LOCATION ('pxf://tmp/pxf_examples/customers.txt.gz?PROFILE=hdfs:text&SERVER=hadoop&SKIP_HEADER_COUNT=1') FORMAT 'TEXT' (delimiter=E','); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_plain;Вывод должен выглядеть следующим образом:
id | first_name | last_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)
Чтение многострочных текстовых данных из HDFS
-
В каталоге /tmp на хосте HDFS создайте текстовый файл с разделителями под названием customers_multiline.txt и со следующим содержимым. Обратите внимание, что в качестве разделителя используется символ двоеточия (
:). Также обратите внимание на кавычки вокруг поляaddress: поле содержит встроенный символ перевода строки, отделяющий адрес от города:id:first_name:last_name:email:address 1:John:Doe:john.doe@example.com:"123 Elm Street New York" 2:Jane:Smith:jane.smith@example.com:"456 Oak Street Chicago" 3:Bob:Brown:bob.brown@example.com:"789 Pine Street Los Angeles" 4:Rob:Stuart:rob.stuart@example.com:"119 Willow Street New Orleans"
-
Поместите текстовый файл в HDFS:
$ hdfs dfs -put /tmp/customers_multiline.txt /tmp/pxf_examples/ -
На мастер-хосте Greengage DB создайте читающую внешнюю таблицу, ссылающуюся на файл customers_multiline.txt. В выражении
LOCATIONукажите PXF-профильhdfs:text:multiи конфигурацию сервера. Включите пропуск заголовка с помощью опцииSKIP_HEADER_COUNT. В выраженииFORMATукажитеCSVв качестве формата данных, а символ двоеточия (:) — в качестве разделителя (delimiter):CREATE EXTERNAL TABLE customers_multiline ( id INTEGER, first_name TEXT, last_name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://tmp/pxf_examples/customers_multiline.txt?PROFILE=hdfs:text:multi&SERVER=hadoop&SKIP_HEADER_COUNT=1') FORMAT 'CSV' (delimiter ':'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_multiline;Вывод должен выглядеть следующим образом:
id | first_name | last_name | email | address ----+------------+-----------+------------------------+------------------- 1 | John | Doe | john.doe@example.com | 123 Elm Street | | | | New York 2 | Jane | Smith | jane.smith@example.com | 456 Oak Street | | | | Chicago 3 | Bob | Brown | bob.brown@example.com | 789 Pine Street | | | | Los Angeles 4 | Rob | Stuart | rob.stuart@example.com | 119 Willow Street | | | | New Orleans (4 rows)
Запись текстовых данных в HDFS
-
На мастер-хосте Greengage DB создайте пишущую внешнюю таблицу, сохраняющую данные в HDFS-каталог /tmp/pxf_examples/customers. В выражении
LOCATIONукажите PXF-профильhdfs:textи конфигурацию сервера, а в качестве кодека для сжатия выберитеgzip. В выраженииFORMATукажитеTEXTв качестве формата данных, а символ запятой (,) — в качестве разделителя (delimiter):CREATE WRITABLE EXTERNAL TABLE customers_w ( id INTEGER, first_name TEXT, last_name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://tmp/pxf_examples/customers?PROFILE=hdfs:text&SERVER=hadoop&COMPRESSION_CODEC=gzip') FORMAT 'TEXT' (delimiter ','); -
Вставьте содержимое ранее созданной читающей таблицы
customers_plainв таблицуcustomers_w:INSERT INTO customers_w SELECT * FROM customers_plain; -
Вставьте несколько значений в таблицу
customers_wвручную:INSERT INTO customers_w ( id, first_name, last_name, email, address ) VALUES (5,'Alice','Johnson','alice.johnson@example.com','10 Oak Avenue'), (6,'Charlie','Williams','charlie.williams@example.com','42 Maple Drive'); -
На хосте HDFS просмотрите содержимое файлов в каталоге customers:
$ hdfs dfs -text /tmp/pxf_examples/customers/*Вывод должен выглядеть следующим образом:
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 5,Alice,Johnson,alice.johnson@example.com,10 Oak Avenue 6,Charlie,Williams,charlie.williams@example.com,42 Maple Drive