CREATE EXTERNAL TABLE
Определяет новую внешнюю таблицу.
Синтаксис
CREATE [READABLE] EXTERNAL [TEMPORARY | TEMP] TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table>)
LOCATION ('file://<seghost>[:<port>]/<path>/<file>' [, ...])
| ('gpfdist://<filehost>[:<port>]/<file_pattern>[#transform=<trans_name>]'
[, ...])
| ('gpfdists://<filehost>[:<port>]/<file_pattern>[#transform=<trans_name>]'
[, ...])
| ('pxf://<path-to-data>?PROFILE=<profile_name>[&SERVER=<server_name>][&<custom-option>=<value>[...]]')
| ('s3://<S3_endpoint>[:<port>]/<bucket_name>/[<S3_prefix>] [region=<S3-region>] [config=<config_file> | config_server=<url>]')
[ON MASTER]
FORMAT 'TEXT'
[( [HEADER]
[DELIMITER [AS] '<delimiter>' | 'OFF']
[NULL [AS] '<null string>']
[ESCAPE [AS] '<escape>' | 'OFF']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[FILL MISSING FIELDS] )]
| 'CSV'
[( [HEADER]
[QUOTE [AS] '<quote>']
[DELIMITER [AS] '<delimiter>']
[NULL [AS] '<null string>']
[FORCE NOT NULL <column> [, ...]]
[ESCAPE [AS] '<escape>']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[FILL MISSING FIELDS] )]
| 'CUSTOM' (Formatter=<formatter_specification>)
[ ENCODING '<encoding>' ]
[ [LOG ERRORS [PERSISTENTLY]] SEGMENT REJECT LIMIT <count>
[ROWS | PERCENT] ]
CREATE [READABLE] EXTERNAL WEB [TEMPORARY | TEMP] TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table>)
LOCATION ('http://<webhost>[:<port>]/<path>/<file>' [, ...])
| EXECUTE '<command>' [ON ALL
| MASTER
| <number_of_segments>
| HOST ['<segment_hostname>']
| SEGMENT <segment_id> ]
FORMAT 'TEXT'
[( [HEADER]
[DELIMITER [AS] '<delimiter>' | 'OFF']
[NULL [AS] '<null string>']
[ESCAPE [AS] '<escape>' | 'OFF']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[FILL MISSING FIELDS] )]
| 'CSV'
[( [HEADER]
[QUOTE [AS] '<quote>']
[DELIMITER [AS] '<delimiter>']
[NULL [AS] '<null string>']
[FORCE NOT NULL <column> [, ...]]
[ESCAPE [AS] '<escape>']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[FILL MISSING FIELDS] )]
| 'CUSTOM' (Formatter=<formatter_specification>)
[ ENCODING '<encoding>' ]
[ [LOG ERRORS [PERSISTENTLY]] SEGMENT REJECT LIMIT <count>
[ROWS | PERCENT] ]
CREATE WRITABLE EXTERNAL [TEMPORARY | TEMP] TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table>)
LOCATION('gpfdist://<outputhost>[:<port>]/<filename>[#transform=<trans_name>]'
[, ...])
| ('gpfdists://<outputhost>[:<port>]/<file_pattern>[#transform=<trans_name>]'
[, ...])
FORMAT 'TEXT'
[( [DELIMITER [AS] '<delimiter>']
[NULL [AS] '<null string>']
[ESCAPE [AS] '<escape>' | 'OFF'] )]
| 'CSV'
[([QUOTE [AS] '<quote>']
[DELIMITER [AS] '<delimiter>']
[NULL [AS] '<null string>']
[FORCE QUOTE <column> [, ...] | * ]
[ESCAPE [AS] '<escape>'] )]
| 'CUSTOM' (Formatter=<formatter_specification>)
[ ENCODING '<write_encoding>' ]
[ DISTRIBUTED BY ({<column> [<opclass>]}, [ ... ] ) | DISTRIBUTED RANDOMLY ]
CREATE WRITABLE EXTERNAL [TEMPORARY | TEMP] TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table>)
LOCATION('s3://<S3_endpoint>[:<port>]/<bucket_name>/[<S3_prefix>] [region=<S3-region>] [config=<config_file> | config_server=<url>]')
[ON MASTER]
FORMAT 'TEXT'
[( [DELIMITER [AS] '<delimiter>']
[NULL [AS] '<null string>']
[ESCAPE [AS] '<escape>' | 'OFF'] )]
| 'CSV'
[([QUOTE [AS] '<quote>']
[DELIMITER [AS] '<delimiter>']
[NULL [AS] '<null string>']
[FORCE QUOTE <column> [, ...] | * ]
[ESCAPE [AS] '<escape>'] )]
CREATE WRITABLE EXTERNAL WEB [TEMPORARY | TEMP] TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
EXECUTE '<command>'
FORMAT 'TEXT'
[( [DELIMITER [AS] '<delimiter>']
[NULL [AS] '<null string>']
[ESCAPE [AS] '<escape>' | 'OFF'] )]
| 'CSV'
[([QUOTE [AS] '<quote>']
[DELIMITER [AS] '<delimiter>']
[NULL [AS] '<null string>']
[FORCE QUOTE <column> [, ...] | * ]
[ESCAPE [AS] '<escape>'] )]
| 'CUSTOM' (Formatter=<formatter_specification>)
[ ENCODING '<write_encoding>' ]
[ DISTRIBUTED BY ({<column> [<opclass>]}, [ ... ] ) | DISTRIBUTED RANDOMLY ]
Описание
CREATE EXTERNAL TABLE или CREATE EXTERNAL WEB TABLE создает определение новой читающей внешней таблицы в Greengage DB.
Читающие внешние таблицы обычно используются для быстрой параллельной загрузки данных.
После определения внешней таблицы можно запрашивать ее данные напрямую (и параллельно), используя команды SQL.
Например, можно выбирать, объединять или сортировать данные внешней таблицы.
Также можно создавать представления (view) для внешних таблиц.
Операции DML (UPDATE, INSERT, DELETE или TRUNCATE) не допускаются для читающих внешних таблиц; для них также нельзя создавать индексы.
CREATE WRITABLE EXTERNAL TABLE или CREATE WRITABLE EXTERNAL WEB TABLE создает определение новой пишущей (writable) внешней таблицы в базе данных Greengage DB.
Пишущие внешние таблицы обычно используются для выгрузки данных из базы данных в файлы или именованные каналы.
Пишущие внешние веб-таблицы также могут использоваться для вывода данных в исполняемую программу.
Кроме того, пишущие внешние таблицы могут использоваться в качестве целей вывода для параллельных вычислений MapReduce в Greengage DB.
После определения пишущей внешней таблицы данные могут быть выбраны из таблиц базы данных и вставлены во внешнюю таблицу.
Пишущие внешние таблицы допускают только операции INSERT.
Операции SELECT, UPDATE, DELETE или TRUNCATE не разрешены.
Основное различие между обычными внешними таблицами и внешними веб-таблицами заключается в источниках данных. Обычные читающие внешние таблицы обращаются к статическим плоским файлам, тогда как внешние веб-таблицы обращаются к динамическим источникам данных — либо на веб-сервере, либо путем выполнения команд операционной системы или скриптов.
Подробную информацию о работе с внешними таблицами см. в разделе Обзор внешних таблиц.
Параметры
| Параметр | Описание |
|---|---|
READABLE | WRITABLE |
Указывает тип внешней таблицы (по умолчанию — читающая, |
WEB |
Создает определение читающей или пишущей внешней веб-таблицы в Greengage DB. Существует две формы читающих внешних веб-таблиц — те, которые обращаются к файлам по HTTP-протоколу, и те, которые получают данные путем выполнения команд ОС. Пишущие внешние веб-таблицы выводят данные в исполняемую программу, которая может принимать входной поток данных. Внешние веб-таблицы не могут быть повторно сканированы во время выполнения запроса. Протокол |
TEMPORARY | TEMP |
Создает временную читающую или пишущую внешнюю таблицу в Greengage DB. Временные внешние таблицы существуют в специальной схеме — при создании такой таблицы нельзя указывать имя схемы. Временные внешние таблицы автоматически удаляются в конце сеанса. Существующая постоянная таблица с тем же именем становится невидимой для текущего сеанса, пока существует временная таблица, если только вы не ссылаетесь на постоянную таблицу с указанием ее схемы |
table_name |
Имя новой внешней таблицы |
column_name |
Имя столбца, создаваемого во внешней таблице. В отличие от обычных таблиц, внешние таблицы не имеют ограничений столбцов или значений по умолчанию, поэтому не указывайте их |
LIKE <other_table> |
Выражение |
data_type |
Тип данных столбца |
LOCATION ('<protocol>://[<host>[:<port>]]/<path>/<file>' [, …]) |
Если вы используете протокол Если вы используете протокол Для читающих внешних таблиц параметр указывает URI внешнего источника данных, используемого для наполнения внешней таблицы или веб-таблицы.
Обычные читающие внешние таблицы поддерживают протоколы 'gpfdist://filehost:8081/*' 'gpfdist://masterhost/my_load_file' 'file://seghost1/dbfast1/external/myfile.txt' 'http://intranet.example.com/finance/expenses.csv' Для пишущих внешних таблиц параметр 'gpfdist://outputhost:8081/data1.out', 'gpfdist://outputhost:8081/data2.out' При двух местоположениях С помощью опции |
ON MASTER |
Ограничивает все операции, связанные с таблицей, только мастер-сегментом Greengage DB.
Разрешено только для читающих и пишущих внешних таблиц, созданных с использованием протокола ПРИМЕЧАНИЕ
Важно помнить о возможном влиянии на ресурсы при чтении или записи во внешние таблицы, созданные с выражением |
EXECUTE '<command>' [ON …] |
Разрешено только для читающих внешних веб-таблиц или пишущих внешних таблиц.
Для читающих внешних веб-таблиц указывает команду ОС, которая должна быть выполнена экземплярами сегментов.
Команда может быть одиночной командой ОС или скриптом.
Выражение
Для пишущих внешних таблиц команда, указанная в выражении |
FORMAT 'TEXT | CSV' (<options>) |
Когда выражение Более подробная информация о форматировании внешних данных приводится в статье Форматирование внешних данных. Если вы используете протокол |
FORMAT 'CUSTOM' (formatter=<formatter_specification>) |
Указывает кастомный формат данных.
Более подробная информация о кастомных форматах данных приводится в статье Использование кастомных форматов и протоколов для внешних таблиц. Если вы используете протокол |
DELIMITER |
Задает один символ ASCII, который разделяет столбцы внутри каждой строки данных.
По умолчанию это символ табуляции в режиме Для протокола |
NULL |
Указывает строку, представляющую значение В качестве примера для формата
|
ESCAPE |
Указывает одиночный символ, который используется для последовательностей экранирования в языке C (таких как |
NEWLINE |
Указывает символ новой строки, используемый в ваших файлах данных — |
HEADER |
Для читающих внешних таблиц указывает, что первая строка в файле данных является строкой заголовка (содержит имена столбцов таблицы) и не должна включаться в данные таблицы. При использовании нескольких исходных файлов данных все файлы должны иметь строку заголовка. Для протокола Протокол |
QUOTE |
Указывает символ кавычки для режима |
FORCE NOT NULL |
В режиме |
FORCE QUOTE |
В режиме |
FILL MISSING FIELDS |
В режимах |
ENCODING '<encoding>' |
Кодировка символов для использования во внешней таблице.
Укажите строковую константу (например, |
LOG ERRORS [PERSISTENTLY] |
Необязательное выражение, которое может предшествовать выражению Данные удаляются при удалении внешней таблицы, если не указано ключевое слово Доступ к данным журнала ошибок осуществляется с помощью встроенной SQL-функции Greengage DB Если вы используете ключевое слово См. Примечания для получения информации о журнале ошибок и встроенных функциях для просмотра и управления информацией журнала ошибок |
SEGMENT REJECT LIMIT <count> [ROWS | PERCENT] |
Запускает операцию Лимит начального количества отклоненных строк можно изменить с помощью параметра конфигурации сервера Greengage DB |
DISTRIBUTED BY ({<column> [<opclass>]}, [ … ] ) |
Используется для объявления политики распределения Greengage DB для пишущей внешней таблицы.
По умолчанию пишущие внешние таблицы распределяются случайным образом ( |
Примеры
Запустите утилиту файлового сервера gpfdist в фоновом режиме на порте 8081 для раздачи файлов из каталога /var/data/staging:
$ gpfdist -p 8081 -d /var/data/staging -l /home/<gpadmin>/log &
Ниже показано создание читающей внешней таблицы с именем ext_customer с использованием протокола gpfdist и любых текстовых файлов (*.txt), найденных в каталоге gpfdist.
Файлы отформатированы с использованием вертикальной черты (|) в качестве разделителя столбцов и пробела в качестве NULL.
Доступ к внешней таблице осуществляется в режиме изоляции ошибок одной строки:
CREATE EXTERNAL TABLE ext_customer
(
id int,
name text,
sponsor text
)
LOCATION ( 'gpfdist://filehost:8081/*.txt' )
FORMAT 'TEXT' ( DELIMITER '|' NULL ' ')
LOG ERRORS SEGMENT REJECT LIMIT 5;
Создание такой же читающей внешней таблицы, как указано выше, но с файлами в формате CSV:
CREATE EXTERNAL TABLE ext_customer
(
id int,
name text,
sponsor text
)
LOCATION ( 'gpfdist://filehost:8081/*.csv' )
FORMAT 'CSV' ( DELIMITER ',' );
Создание читающей внешней таблицы с именем ext_expenses с использованием протокола file и нескольких файлов в формате CSV, имеющих строку заголовка:
CREATE EXTERNAL TABLE ext_expenses
(
name text,
date date,
amount float4,
category text,
description text
)
LOCATION (
'file://seghost1/dbfast/external/expenses1.csv',
'file://seghost1/dbfast/external/expenses2.csv',
'file://seghost2/dbfast/external/expenses3.csv',
'file://seghost2/dbfast/external/expenses4.csv',
'file://seghost3/dbfast/external/expenses5.csv',
'file://seghost3/dbfast/external/expenses6.csv'
)
FORMAT 'CSV' ( HEADER );
Создание читающей внешней веб-таблицы, которая запускает скрипт один раз на каждом хосте сегментов:
CREATE EXTERNAL WEB TABLE log_output
(
linenum int,
message text
)
EXECUTE '/var/load_scripts/get_log_data.sh' ON HOST
FORMAT 'TEXT' (DELIMITER '|');
Создание пишущей внешней таблицы с именем sales_out, которая использует gpfdist для записи выходных данных в файл с именем sales.out.
Файлы отформатированы с использованием вертикальной черты (|) в качестве разделителя столбцов и пробела в качестве NULL.
CREATE WRITABLE EXTERNAL TABLE sales_out
(
LIKE sales
)
LOCATION ('gpfdist://etl1:8081/sales.out')
FORMAT 'TEXT' ( DELIMITER '|' NULL ' ')
DISTRIBUTED BY (txn_id);
Создание пишущей внешней веб-таблицы, которая передает выходные данные, полученные сегментами, в исполняемый скрипт с именем to_adreport_etl.sh:
CREATE WRITABLE EXTERNAL WEB TABLE campaign_out
(
LIKE campaign
)
EXECUTE '/var/unload_scripts/to_adreport_etl.sh'
FORMAT 'TEXT' (DELIMITER '|');
Использование созданной выше пишущей внешней таблицы для выгрузки выбранных данных:
INSERT INTO campaign_out
SELECT *
FROM campaign
WHERE customer_id = 123;
Примечания
При указании выражения LOG ERRORS Greengage DB фиксирует ошибки, возникающие при чтении данных внешней таблицы.
Вы можете просматривать и управлять зафиксированными данными журнала ошибок.
Функции для управления данными журнала зависят от того, являются ли данные постоянными (используется ли ключевое слово PERSISTENTLY с выражением LOG ERRORS).
-
Функции, управляющие непостоянными данными журнала ошибок внешних таблиц, которые были определены без ключевого слова
PERSISTENTLY.-
Встроенная SQL-функция
gp_read_error_log('table_name')отображает информацию журнала ошибок для внешней таблицы. Этот пример отображает данные журнала ошибок для внешней таблицыext_expenses:SELECT * from gp_read_error_log('ext_expenses');Функция не возвращает данные, если внешняя таблица была создана с выражением
LOG ERRORS PERSISTENTLYили если внешняя таблица не существует. -
Встроенная SQL-функция
gp_truncate_error_log('table_name')удаляет данные журнала ошибок дляtable_name. Этот пример удаляет данные журнала ошибок, зафиксированные для внешней таблицыext_expenses:SELECT gp_truncate_error_log('ext_expenses');Удаление таблицы также удаляет данные журнала этой таблицы. Функция не очищает данные журнала, если внешняя таблица определена с выражением
LOG ERRORS PERSISTENTLY. Функция возвращаетFALSE, если таблица не существует.
-
-
Функции, управляющие постоянными данными журнала ошибок внешних таблиц, которые были определены с ключевым словом
PERSISTENTLY.ПРИМЕЧАНИЕФункции, управляющие постоянными данными журнала ошибок внешних таблиц, определены в файле $GPHOME/share/postgresql/contrib/gpexterrorhandle.sql. Функции должны быть установлены в базы данных, использующие постоянные данные журнала ошибок внешней таблицы. Эта команда
psqlустанавливает функции в базу данныхtestdb.$ psql -d test -U gpadmin -f $GPHOME/share/postgresql/contrib/gpexterrorhandle.sql-
SQL-функция
gp_read_persistent_error_log('table_name')отображает постоянные данные журнала для внешней таблицы. Функция не возвращает данные, если внешняя таблица была создана без ключевого словаPERSISTENTLY. Функция возвращает постоянные данные журнала для внешней таблицы даже после того, как таблица была удалена. -
SQL-функция
gp_truncate_persistent_error_log('table_name')очищает постоянные данные журнала для таблицы. Постоянные данные журнала необходимо удалять вручную. Удаление внешней таблицы (DROP) не удаляет постоянные данные журнала.
-
-
Следующие пункты относятся как к непостоянным, так и к постоянным данным журнала ошибок и соответствующим функциям:
-
Функции
gp_read_*требуют привилегииSELECTна таблицу. -
Функции
gp_truncate_*требуют привилегии владельца таблицы. -
Можно использовать символ подстановки
*для удаления информации журнала ошибок для существующих таблиц в текущей базе данных. Укажите строку *.* для удаления информации журнала ошибок всей базы данных, включая информацию, которая не была удалена из-за предыдущих проблем с базой данных. Если указано*, требуются права владельца базы данных. Если указано *.*, требуются права суперпользователя операционной системы. Непостоянные и постоянные данные журнала ошибок должны удаляться с помощью соответствующих функцийgp_truncate_*.
-
Когда несколько внешних таблиц Greengage DB определены с протоколом gpfdist, gpfdists или file и обращаются к одному и тому же именованному каналу (pipe) в системе Linux, Greengage DB ограничивает доступ к именованному каналу одним читающим процессом.
Если второй читающий процесс попытается получить доступ к именованному каналу, будет возвращена ошибка.
Совместимость
CREATE EXTERNAL TABLE является расширением Greengage DB.
Стандарт SQL не предусматривает внешних таблиц.