Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Относится к: SQL Server 2016 (13.x) и более поздние версии
, Azure SQL Database
, Azure SQL Managed Instance
, Azure Synapse Analytics
, Analytics Platform System (PDW)
, Хранилище в Microsoft Fabric
, SQL Database в Microsoft Fabric
Создает внешнюю таблицу.
Эта статья приводит синтаксис, аргументы, комментарии, разрешения и примеры для любых выбранных продуктов SQL.
Выбор продукта
В следующей строке выберите название нужного продукта, и отобразится информация только об этом продукте.
* SQL Server *
Обзор: SQL Server
Эта команда создает внешнюю таблицу для PolyBase для доступа к данным, хранящимся в кластере Hadoop или Хранилище BLOB-объектов Azure внешней таблице PolyBase, которая ссылается на данные, хранящиеся в кластере Hadoop или Хранилище BLOB-объектов Azure.
Область применения: SQL Server 2016 (13.x) и более поздних версий.
Используйте внешнюю таблицу с внешним источником данных для запросов PolyBase. Внешние источники данных используются для обеспечения взаимодействия и поддерживают следующие основные варианты использования.
- Виртуализация данных и загрузка данных с помощью виртуализации данных с PolyBase в SQL Server
- Операции массовой загрузки в SQL Server или базе данных SQL с помощью
BULK INSERTилиOPENROWSET
Внешняя таблица основана на внешнем источнике данных.
Соглашения о синтаксисе Transact-SQL
Синтаксис
-- Create a new external table
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ , ...n ] )
WITH (
LOCATION = 'folder_or_filepath' ,
DATA_SOURCE = external_data_source_name ,
[ FILE_FORMAT = external_file_format_name ]
[ , <reject_options> [ , ...n ] ]
)
[ ; ]
<reject_options> ::=
{
| REJECT_TYPE = { value | percentage }
| REJECT_VALUE = reject_value
| REJECT_SAMPLE_VALUE = reject_sample_value ,
| REJECTED_ROW_LOCATION = '/REJECT_Directory'
}
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
Аргументы
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
Имя создаваемой таблицы, состоящее из одной, двух или трех частей.
Для внешней таблицы SQL хранит только метаданные таблицы, а также базовую статистику о файле или папке, на которую ссылается Hadoop или Хранилище BLOB-объектов Azure. Фактические данные не перемещаются или хранятся в SQL Server.
Внимание
Для повышения производительности, если драйвер внешнего источника данных поддерживает трехкомпонентное имя, необходимо указать трехкомпонентное имя.
< > column_definition [ ,... n ]
CREATE EXTERNAL TABLE поддерживает возможность настройки имени столбца, типа данных, допустимости значений NULL и параметров сортировки. Нельзя использовать внешние DEFAULT CONSTRAINT таблицы.
Определения столбцов, включая типы данных и количество столбцов, должны соответствовать данным во внешних файлах. Если есть несоответствие, строки файлов отклоняются при запросе фактических данных.
LOCATION = путь_к_папке_или_файлу
Указывает путь к папке или файлу и имя файла для фактических данных в Хранилище BLOB-объектов Azure или Hadoop. Кроме того, начиная с SQL Server 2022 (16.x) поддерживается совместимое с S3 хранилище объектов. Расположение начинается с корневой папки. Она представляет собой расположение данных, указанное во внешнем источнике данных.
В SQL Server инструкция CREATE EXTERNAL TABLE создает путь и папку, если она еще не существует. Затем можно экспортировать INSERT INTO данные из локальной таблицы SQL Server во внешний источник данных. Дополнительные сведения см. в сценариях запросов PolyBase.
Если вы указываете LOCATION папку, запрос PolyBase, который выбирает внешнюю таблицу, извлекает файлы из папки и всех ее вложенных папок. Как и Hadoop, PolyBase не возвращает скрытые папки. Он также не возвращает файлы, для которых имя файла начинается с подчеркивания (_) или периода (.).
В следующем примере изображения, если LOCATION='/webdata/'запрос PolyBase возвращает строки из mydata.txt и mydata2.txt. Он не возвращается mydata3.txt , так как это файл в скрытой вложенной папке. И он не возвращается _hidden.txt , так как это скрытый файл.
Чтобы изменить значение по умолчанию и только для чтения в корневой папке, установите для атрибута <polybase.recursive.traversal> значение false в файле конфигурации core-site.xml. Этот файл находится под <SqlBinRoot>\PolyBase\Hadoop\Conf корнем bin SQL Server. Например, C:\Program Files\Microsoft SQL Server\MSSQL13.XD14\MSSQL\Binn.
DATA_SOURCE = external_data_source_name
Указывает имя внешнего источника данных, содержащего расположение внешних данных. Это расположение — файловая система Hadoop (HDFS), контейнер Хранилище BLOB-объектов Azure или Azure Data Lake Store. Чтобы создать внешний источник данных, используйте CREATE EXTERNAL DATA SOURCE.
FILE_FORMAT = external_file_format_name
Указывает имя объекта формата внешнего файла, который хранит тип файла и метод сжатия для внешних данных. Чтобы создать формат внешнего файла, используйте CREATE EXTERNAL FILE FORMAT.
Форматы внешних файлов можно повторно использовать несколькими похожими внешними файлами.
Параметры REJECT
Этот параметр можно использовать только с внешними источниками данных, где TYPE = HADOOP.
Можно указать параметры отклонения, определяющие, как PolyBase обрабатывает грязные записи, полученные из внешнего источника данных. Запись считается "грязной", если фактический тип данных или количество столбцов не совпадают с определениями столбцов во внешней таблице.
Если вы не указываете или не меняете значения отклонения, PolyBase использует значения по умолчанию. Эти сведения о параметрах отклонения хранятся в виде дополнительных метаданных при создании внешней таблицы с CREATE EXTERNAL TABLE оператором. Когда будущая SELECT инструкция или SELECT INTO SELECT инструкция выбирает данные из внешней таблицы, PolyBase использует параметры отклонения, чтобы определить количество или процент строк, которые могут быть отклонены до сбоя фактического запроса. Запрос возвращает (частичные) результаты до превышения порогового значения отклонения. Затем он выдаст соответствующее сообщение об ошибке.
REJECT_TYPE = { значение | процент }
Указывает, указан литерал REJECT_VALUE или процент.
значение
REJECT_VALUE— это литеральное значение, а не процент. Запрос завершается ошибкой, если число отклоненных строк превышает reject_value.Например, если
REJECT_VALUE = 5иREJECT_TYPE = valueзапрос завершается ошибкойSELECTпосле того, как пять строк отклоняются.процент
REJECT_VALUE— это процент, а не литеральное значение. Запрос завершается ошибкой, если процент неудачных строк превышает reject_value. Процент недопустимых строк вычисляется с интервалами.
REJECT_VALUE = reject_value
Задает значение или процент строк, которые можно отклонить, прежде чем запрос завершится ошибкой.
Для REJECT_TYPE = value, reject_value должно быть целым числом от 0 до 2 147 483 647.
Для REJECT_TYPE = percentage, reject_value должен быть плавающей в диапазоне от 0 до 100.
REJECT_SAMPLE_VALUE = reject_sample_value
Этот атрибут требуется при указании REJECT_TYPE = percentage. Он определяет количество строк, которое запрос попытается извлечь, прежде чем PolyBase пересчитает процент отклоненных строк.
Параметр reject_sample_value должен быть целым числом от 0 до 2 147 483 647.
Например, если REJECT_SAMPLE_VALUE = 1000PolyBase вычисляет процент неудачных строк после попытки импортировать 1000 строк из внешнего файла данных. Если процент неудачных строк меньше reject_value, PolyBase пытается получить еще 1000 строк. Он продолжает пересчитывать процент неудачных строк после попытки импортировать все дополнительные 1000 строк.
Примечание.
Поскольку PolyBase вычисляет процент отклоненных строк с интервалами, фактический процент отклоненных строк может превысить reject_value.
Пример
В этом примере показано, как три REJECT варианта взаимодействуют друг с другом. Например, если REJECT_TYPE = percentage, REJECT_VALUE = 30и REJECT_SAMPLE_VALUE = 100может произойти следующий сценарий:
- PolyBase попытается извлечь первые 100 строк; из них 25 отклонено, а 75 — извлечено успешно.
- Процент строк с ошибками равен 25 %, что меньше значения отклонения — 30 %. В результате PolyBase продолжает получать данные из внешнего источника данных.
- PolyBase пытается загрузить следующие 100 строк. На этот раз 25 строк извлечено успешно и 75 — отклонено.
- Процент отклоненных строк пересчитывается и составляет 50 %. Процент отклоненных строк превысил значение отклонения 30 %.
- Запрос PolyBase завершается ошибкой, поскольку после попытки извлечение первых 200 строк 50 % из них было отклонено. Соответствующие строки возвращаются до того, как запрос PolyBase обнаруживает превышение порогового значения отклонения.
REJECTED_ROW_LOCATION = расположение каталога
Область применения: SQL Server 2019 (15.x) CU 6 и более поздних версий и Azure Synapse Analytics.
Указывает каталог во внешнем источнике данных, в который должны записываться строки и соответствующий файл ошибок.
Если указанный путь не существует, PolyBase создает его от вашего имени. Дочерний каталог создается с именем _rejectedrows. Символ _ гарантирует, что каталог экранируется для другой обработки данных, если не указано явно в параметре расположения. В этом каталоге существует папка, созданная на основе времени отправки нагрузки в формате YearMonthDay -HourMinuteSecond (например, 20230330-173205). В этой папке записываются два типа файлов, _reason файл и файл данных. Этот параметр можно использовать только с внешними источниками данных, где TYPE = HADOOP и для внешних таблиц с помощью DELIMITEDTEXTFORMAT_TYPE. Дополнительные сведения см. в статье CREATE EXTERNAL DATA SOURCE and CREATE EXTERNAL FILE FORMAT.
Файлы причин и файлы данных имеют queryID, связанные с оператором CTAS. Так как данные и причины хранятся в отдельных файлах, эти файлы имеют соответствующие суффиксы.
Разрешения
Требуются следующие разрешения:
CREATE TABLEALTER ANY SCHEMAALTER ANY EXTERNAL DATA SOURCE-
ALTER ANY EXTERNAL FILE FORMAT(применяется только к внешним источникам данных Службы хранилища Azure и Hadoop) -
CONTROL DATABASE(применяется только к внешним источникам данных Службы хранилища Azure и Hadoop)
Обратите внимание, что удаленное имя входа, указанное в DATABASE SCOPED CREDENTIALCREATE EXTERNAL TABLE команде, должно иметь разрешение на чтение пути или таблицы или коллекции во внешнем источнике данных, указанном в параметре LOCATION . Если вы планируете использовать это EXTERNAL TABLE для экспорта данных в внешний источник данных Hadoop или службы хранилища Azure, то указанный вход должен иметь разрешение на запись по пути, указанному в LOCATION. Hadoop не поддерживается в SQL Server 2022 (16.x).
Для Хранилища BLOB-объектов Azure при настройке ключей доступа и подписанного URL-адреса (SAS) на портале Azure, в учетных записях хранения Хранилища BLOB-объектов Azure или ADLS 2-го поколения нужно выбрать Предоставленные разрешения, чтобы предоставить по крайней мере разрешения Чтение и Запись. Также может потребоваться разрешение List при поиске по папкам. Необходимо также выбрать элементы Контейнер и Объект в качестве допустимых типов ресурсов.
Внимание
Разрешение ALTER ANY EXTERNAL DATA SOURCE предоставляет любому субъекту возможность создавать и изменять любой объект внешнего источника данных, поэтому он также предоставляет возможность доступа ко всем учетным данным в области базы данных. Это разрешение следует рассматривать как высоко привилегированное, поэтому его следует предоставлять только доверенным субъектам в системе.
Обработка ошибок
При выполнении инструкции CREATE EXTERNAL TABLE PolyBase пытается подключиться к внешнему источнику данных. Если попытка подключения завершается ошибкой, оператор завершается ошибкой, и внешняя таблица не создается. Это может занять около минуты, поскольку PolyBase повторяет попытки соединения, прежде чем запрос будет завершен ошибкой.
Замечания
В нерегламентированных сценариях запросов, таких как SELECT FROM EXTERNAL TABLEPolyBase, хранит строки, полученные из внешнего источника данных во временной таблице. После выполнения запроса PolyBase удаляет временную таблицу. В таблицах SQL не сохраняются постоянные данные. Напротив, в сценарии импорта, например SELECT INTO FROM EXTERNAL TABLEPolyBase, сохраняет строки, полученные из внешнего источника данных, в качестве постоянных данных в таблице SQL. Новая таблица создается при выполнении запросов, когда PolyBase извлекает внешние данные.
Формат Hadoop поддерживается только в SQL Server 2016 (13.x), SQL Server 2017 (14.x) и SQL Server 2019 (15.x).
PolyBase может передать некоторые вычисления запросов в Hadoop для повышения производительности запросов. Это действие называется pushdown предикатом. Для его выполнения задайте параметр расположения диспетчера ресурсов Hadoop в CREATE EXTERNAL DATA SOURCE.
Вы можете создать несколько внешних таблиц, которые ссылаются на один или разные внешние источники данных.
Ограничения
Так как данные для внешней таблицы не контролируются прямым управлением SQL Server, их можно изменять или удалять в любое время внешним процессом. По этой причине результаты запроса к внешней таблице необязательно будут детерминированными. Один и то же запрос может возвращать разные результаты при каждом обращении к внешней таблице. Аналогичным образом, запрос может завершиться ошибкой, если внешние данные удалены или перемещены.
Вы можете создать несколько внешних таблиц, которые ссылаются на разные внешние источники данных. Если же вы одновременно выполняете запросы к различным источникам данных Hadoop, каждый источник Hadoop должен иметь одинаковый параметр конфигурации сервера hadoop connectivity. Например, невозможно одновременно выполнить запрос к кластеру Cloudera Hadoop и кластеру Hortonworks Hadoop, поскольку они используют разные параметры конфигурации. Параметры конфигурации и поддерживаемые сочетания см. в разделе "Конфигурация подключения PolyBase".
Если внешняя таблица использует DELIMITEDTEXT, CSVPARQUETили DELTA как типы данных, внешние таблицы поддерживают статистику только для одного столбца для каждой CREATE STATISTICS команды.
Только эти инструкции DDL допускаются для внешних таблиц:
-
CREATE TABLEиDROP TABLE. -
CREATE STATISTICSиDROP STATISTICS. -
CREATE VIEWиDROP VIEW.
Неподдерживаемые конструкции и операции:
- Ограничение
DEFAULTна столбцы внешней таблицы - Операции DML обновления, вставки и удаления
Ограничения запросов
PolyBase может обработать не более 33 тысяч файлов на папку при выполнении параллельных запросов PolyBase со степенью 32. Это максимальное число включает файлы и вложенные папки в каждой папке HDFS. Если степень параллелизма меньше 32, пользователь может выполнять запросы PolyBase к папкам в HDFS, если в них содержится более 33 тысяч файлов. Рекомендуется указывать короткие пути к внешним файлам и следить за тем, чтобы в каждой папке HDFS было не более 30 тысяч файлов. При ссылке на слишком большое число файлов может возникнуть исключение, связанное с нехваткой памяти на виртуальной машине Java.
Ограничения по ширине таблицы
В SQL Server 2016 (13.x) PolyBase имеет ограничение ширины строки в 32 КБ на основе максимального размера одной допустимой строки по определению таблицы. Если схема суммы столбцов превышает 32 КБ, PolyBase не сможет запросить данные.
Ограничения типов данных
В внешних таблицах PolyBase нельзя использовать следующие типы данных:
- географии
- геометрии
- hierarchyid (идентификатор иерархии)
- изображения
- текст
- ntext
- XML-
- Любой пользовательский тип
Ограничения, связанные с источником данных
Оракул
Синонимы Oracle не поддерживаются для использования с PolyBase.
Внешние таблицы для коллекций MongoDB, содержащих массивы
Используйте sp_data_source_objects для обнаружения схемы коллекции (столбцов) для коллекций MongoDB, содержащих массивы, и вручную создайте внешнюю таблицу. Хранимая sp_data_source_table_columns процедура также автоматически выполняет преобразование в плоскую структуру с помощью драйвера ODBC PolyBase для MongoDB.
Блокировка
Общая блокировка SCHEMARESOLUTION объекта.
Безопасность
Файлы данных для внешней таблицы хранятся в Hadoop или Хранилище BLOB-объектов Azure. Эти файлы данных создаются и управляются вашими собственными процессами. Это ваша ответственность за управление безопасностью внешних данных.
Примеры
А. Создайте внешнюю таблицу с данными с текстовыми разделителями.
В этом примере показаны все действия по созданию внешней таблицы с данными, отформатированными в виде файлов с текстовыми разделителями. Он определяет внешний источник данных mydatasource и внешний формат файла myfileformat. Затем эти объекты уровня базы данных ссылаются в инструкции CREATE EXTERNAL TABLE. Дополнительные сведения см. в статье CREATE EXTERNAL DATA SOURCE and CREATE EXTERNAL FILE FORMAT.
CREATE EXTERNAL DATA SOURCE mydatasource
WITH (
TYPE = HADOOP,
LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
);
GO
CREATE EXTERNAL FILE FORMAT myfileformat
WITH (
FORMAT_TYPE = DELIMITEDTEXT,
FORMAT_OPTIONS (FIELD_TERMINATOR = '|')
);
GO
CREATE EXTERNAL TABLE ClickStream
(
url VARCHAR (50),
event_date DATE,
user_IP VARCHAR (50)
)
WITH (
DATA_SOURCE = mydatasource,
LOCATION = '/webdata/employee.tbl',
FILE_FORMAT = myfileformat
);
В. Создайте внешнюю таблицу с данными в формате RCFile.
В этом примере показаны все действия по созданию внешней таблицы с данными, отформатированными в виде файлов RCFile. Он определяет внешний источник данных mydatasource_rc и внешний формат файла myfileformat_rc. Затем эти объекты уровня базы данных ссылаются в инструкции CREATE EXTERNAL TABLE. Дополнительные сведения см. в статье CREATE EXTERNAL DATA SOURCE and CREATE EXTERNAL FILE FORMAT.
CREATE EXTERNAL DATA SOURCE mydatasource_rc
WITH (
TYPE = HADOOP,
LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
);
GO
CREATE EXTERNAL FILE FORMAT myfileformat_rc
WITH (
FORMAT_TYPE = RCFILE,
SERDE_METHOD = 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe'
);
GO
CREATE EXTERNAL TABLE ClickStream_rc
(
url VARCHAR (50),
event_date DATE,
user_ip VARCHAR (50)
)
WITH (
DATA_SOURCE = mydatasource_rc,
LOCATION = '/webdata/employee_rc.tbl',
FILE_FORMAT = myfileformat_rc
);
В. Создайте внешнюю таблицу с данными в формате ORC.
В этом примере показаны все действия по созданию внешней таблицы с данными, отформатированными в виде файлов ORC. В нем определяется внешний источник данных mydatasource_orc и формат внешнего файла myfileforma_orc. Затем эти объекты уровня базы данных ссылаются в инструкции CREATE EXTERNAL TABLE. Дополнительные сведения см. в статье CREATE EXTERNAL DATA SOURCE and CREATE EXTERNAL FILE FORMAT.
CREATE EXTERNAL DATA SOURCE mydatasource_orc
WITH (
TYPE = HADOOP,
LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
);
GO
CREATE EXTERNAL FILE FORMAT myfileformat_orc
WITH (
FORMAT = ORC,
COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO
CREATE EXTERNAL TABLE ClickStream_orc (
url VARCHAR (50),
event_date DATE,
user_ip VARCHAR (50)
)
WITH (
LOCATION='/webdata/',
DATA_SOURCE = mydatasource_orc,
FILE_FORMAT = myfileformat_orc
);
Д. Запрос данных Hadoop
ClickStream — это внешняя таблица, соединенная с текстовым файлом с разделителями employee.tbl в кластере Hadoop. Следующий запрос выглядит так же, как запрос к стандартной таблице. Однако этот запрос извлекает данные из Hadoop, а затем вычисляет результаты.
SELECT TOP 10 (url)
FROM ClickStream
WHERE user_ip = 'xxx.xxx.xxx.xxx';
Е. Объединение данных Hadoop с данными SQL
Этот запрос выглядит так же, как стандарт JOIN в двух таблицах SQL. Разница в том, что PolyBase получает сведения о посещениях из Hadoop, а затем объединяет их с таблицей UrlDescription. Одна таблица является внешней, а другая — стандартной таблицей SQL.
SELECT url.description
FROM ClickStream AS cs
INNER JOIN UrlDescription AS url
ON cs.url = url.name
WHERE cs.url = 'msdn.microsoft.com';
F. Импорт данных из Hadoop в таблицу SQL
В этом примере создается новая таблица SQL — ms_user, в которой постоянно хранятся результаты объединения стандартной таблицы SQL user и внешней таблицы ClickStream.
SELECT DISTINCT user.FirstName, user.LastName
INTO ms_user
FROM user INNER JOIN (
SELECT * FROM ClickStream WHERE cs.url = 'www.microsoft.com'
) AS ms
ON user.user_ip = ms.user_ip;
G. Создание внешней таблицы для SQL Server
Перед созданием учетных данных на уровне базы данных в базе данных должен быть главный ключ для защиты учетных данных. Дополнительные сведения см. в разделе CREATE MASTER KEY и CREATE DATABASE SCOPED CREDENTIAL.
-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO
/* specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL SqlServerCredentials
WITH
IDENTITY = '<username>',
SECRET = '<password>';
Создание нового внешнего источника данных с именем SQLServerInstance и внешней таблицы с именем sqlserver.customer.
/* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE SQLServerInstance
WITH (
LOCATION = 'sqlserver://SqlServer',
-- PUSHDOWN = ON | OFF,
CREDENTIAL = SQLServerCredentials
);
GO
CREATE SCHEMA sqlserver;
/* LOCATION: sql server table/view in 'database_name.schema_name.object_name' format
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE sqlserver.customer (
C_CUSTKEY INT NOT NULL,
C_NAME VARCHAR(25) NOT NULL,
C_ADDRESS VARCHAR(40) NOT NULL,
C_NATIONKEY INT NOT NULL,
C_PHONE CHAR(15) NOT NULL,
C_ACCTBAL DECIMAL(15,2) NOT NULL,
C_MKTSEGMENT CHAR(10) NOT NULL,
C_COMMENT VARCHAR(117) NOT NULL
)
WITH (
LOCATION='tpch_10.dbo.customer',
DATA_SOURCE=SqlServerInstance
);
И. Создание внешней таблицы для Oracle
-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO
/*
* Specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL credential_name
WITH
IDENTITY = '<username>',
SECRET = '<password>';
GO
/*
* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CONNECTION_OPTIONS: Specify driver location
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE external_data_source_name
WITH (
LOCATION = 'oracle://<server address>[:<port>]',
-- PUSHDOWN = ON | OFF,CREDENTIAL = credential_name
);
/*
* LOCATION: Oracle table/view in '<database_name>.<schema_name>.<object_name>' format. This may be case sensitive in the Oracle database.
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE customers
(
[O_ORDERKEY] DECIMAL (38) NOT NULL,
[O_CUSTKEY] DECIMAL (38) NOT NULL,
[O_ORDERSTATUS] CHAR COLLATE Latin1_General_BIN NOT NULL,
[O_TOTALPRICE] DECIMAL (15, 2) NOT NULL,
[O_ORDERDATE] DATETIME2 (0) NOT NULL,
[O_ORDERPRIORITY] CHAR (15) COLLATE Latin1_General_BIN NOT NULL,
[O_CLERK] CHAR (15) COLLATE Latin1_General_BIN NOT NULL,
[O_SHIPPRIORITY] DECIMAL (38) NOT NULL,
[O_COMMENT] VARCHAR (79) COLLATE Latin1_General_BIN NOT NULL
)
WITH (
DATA_SOURCE = external_data_source_name,
LOCATION = 'DB1.mySchema.customer'
);
J. Создание внешней таблицы для Teradata
-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO
/*
* Specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL credential_name
WITH
IDENTITY = '<username>',
SECRET = '<password>';
GO
/* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CONNECTION_OPTIONS: Specify driver location
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE external_data_source_name
WITH (
LOCATION = teradata://<server address>[:<port>],
-- PUSHDOWN = ON | OFF,
CREDENTIAL =credential_name
);
GO
/* LOCATION: Teradata table/view in '<database_name>.<object_name>' format
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE customer(
L_ORDERKEY INT NOT NULL,
L_PARTKEY INT NOT NULL,
L_SUPPKEY INT NOT NULL,
L_LINENUMBER INT NOT NULL,
L_QUANTITY DECIMAL(15,2) NOT NULL,
L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
L_DISCOUNT DECIMAL(15,2) NOT NULL,
L_TAX DECIMAL(15,2) NOT NULL,
L_RETURNFLAG CHAR NOT NULL,
L_LINESTATUS CHAR NOT NULL,
L_SHIPDATE DATE NOT NULL,
L_COMMITDATE DATE NOT NULL,
L_RECEIPTDATE DATE NOT NULL,
L_SHIPINSTRUCT CHAR(25) NOT NULL,
L_SHIPMODE CHAR(10) NOT NULL,
L_COMMENT VARCHAR(44) NOT NULL
)
WITH (
LOCATION='customer',
DATA_SOURCE= external_data_source_name
);
K. Создание внешней таблицы для MongoDB
-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO
/*
* Specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL credential_name
WITH
IDENTITY = '<username>',
SECRET = '<password>';
GO
/* LOCATION: Location string should be of format '<type>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CONNECTION_OPTIONS: Specify driver location
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE external_data_source_name
WITH (
LOCATION = mongodb://<server>[:<port>],
-- PUSHDOWN = ON | OFF,
CREDENTIAL = credential_name
);
/* LOCATION: MongoDB table/view in '<database_name>.<schema_name>.<object_name>' format
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE customers(
[O_ORDERKEY] DECIMAL(38) NOT NULL,
[O_CUSTKEY] DECIMAL(38) NOT NULL,
[O_ORDERSTATUS] CHAR COLLATE Latin1_General_BIN NOT NULL,
[O_TOTALPRICE] DECIMAL(15,2) NOT NULL,
[O_ORDERDATE] DATETIME2(0) NOT NULL,
[O_COMMENT] VARCHAR(79) COLLATE Latin1_General_BIN NOT NULL
)
WITH (
LOCATION='customer',
DATA_SOURCE= external_data_source_name
);
L. Запрос хранилища объектов, совместимых с S3, через внешнюю таблицу
Область применения: SQL Server 2022 (16.x) и более поздних версий.
В следующем примере показано использование T-SQL для запроса файла parquet, хранящегося в хранилище объектов, совместимом с S3, с помощью запроса внешней таблицы. В примере используется относительный путь в внешнем источнике данных.
CREATE EXTERNAL DATA SOURCE s3_ds
WITH
( LOCATION = 's3://<ip_address>:<port>/',
CREDENTIAL = s3_dc
);
GO
CREATE EXTERNAL FILE FORMAT ParquetFileFormat
WITH(
FORMAT_TYPE = PARQUET
);
GO
CREATE EXTERNAL TABLE Region (
r_regionkey BIGINT,
r_name CHAR(25),
r_comment VARCHAR(152)
)
WITH (
LOCATION = '/region/',
DATA_SOURCE = 's3_ds',
FILE_FORMAT = ParquetFileFormat
);
Связанный контент
* База данных SQL Azure *
Обзор: База данных SQL Azure
Создает внешнюю таблицу, используемую для:
См. также СТАТЬЮ CREATE EXTERNAL DATA SOURCE.
Синтаксис
Для использования с виртуализацией данных (предварительная версия)
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ , ...n ] )
WITH (
LOCATION = 'filepath' ,
DATA_SOURCE = external_data_source_name ,
FILE_FORMAT = external_file_format_name
)
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
Для использования с эластичными запросами (предварительная версия):
-- Create a table for use with elastic query
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ , ...n ] )
WITH ( <sharded_external_table_options> )
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
<sharded_external_table_options> ::=
DATA_SOURCE = external_data_source_name ,
SCHEMA_NAME = N'nonescaped_schema_name' ,
OBJECT_NAME = N'nonescaped_object_name' ,
[ DISTRIBUTION = SHARDED(sharding_column_name) | REPLICATED | ROUND_ROBIN ] ]
)
[ ; ]
Аргументы
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
Имя создаваемой таблицы, состоящее из одной, двух или трех частей.
Если речь идет о внешней таблице, в SQL хранятся только метаданные таблицы, а также базовая статистика о файле или папке, на которые ссылается база данных SQL Azure. Фактические данные не перемещаются или хранятся в базе данных SQL Azure при создании внешних таблиц.
Внимание
Для повышения производительности, если драйвер внешнего источника данных поддерживает трехкомпонентное имя, необходимо указать трехкомпонентное имя.
< > column_definition [ ,... n ]
CREATE EXTERNAL TABLE поддерживает возможность настройки имени столбца, типа данных, допустимости значений NULL и параметров сортировки. Нельзя использовать внешние DEFAULT CONSTRAINT таблицы. Эти типы данных не поддерживаются для столбцов во внешних таблицах для базы данных SQL Azure:
- географии
- геометрии
- hierarchyid (идентификатор иерархии)
- изображения
- текст
- ntext
- XML-
- json
- Любой пользовательский тип
Определения столбцов, включая типы данных и количество столбцов, должны соответствовать данным во внешних файлах. Если есть несоответствие, строки файлов отклоняются при запросе фактических данных.
Параметры сегментированных внешних таблиц
Указывает внешний источник данных (не источник данных SQL Server) и метод распределения для эластичного запроса.
LOCATION = путь_к_папке_или_файлу
Указывает папку или путь к файлу и имя файла для фактических данных в Azure Data Lake 2-го поколения или хранилище BLOB-объектов Azure. Расположение начинается с корневой папки. Она представляет собой расположение данных, указанное во внешнем источнике данных.
CREATE EXTERNAL TABLE не создает путь к папке.
Если вы указываете LOCATION папку, запрос, который выбирает из внешней таблицы, извлекает файлы из папки, но не все ее вложенные папки.
Управляемый экземпляр SQL Azure не может находить файлы в вложенных папках или скрытых папках. Он также не возвращает файлы, для которых имя файла начинается с подчеркивания (_) или периода (.).
В следующем примере изображения, если LOCATION='/webdata/'запрос возвращает строки из mydata.txt. Он не возвращаетсяmydata2.txt, так как он находится в подпапке, он не возвращается, так как он находится в скрытой папке, и он не возвращается _hidden.txtmydata3.txt, так как это скрытый файл.
ИСТОЧНИК_ДАННЫХ
DATA_SOURCE указывает имя внешнего источника данных, содержащего расположение внешних данных. Чтобы создать внешний источник данных, используйте CREATE EXTERNAL DATA SOURCE. Пример в эластичном запросе DATA_SOURCE — карта сегментов, см. в разделе "Создание внешних таблиц".
FILE_FORMAT = external_file_format_name
Указывает имя объекта формата внешнего файла, который хранит тип файла и метод сжатия для внешних данных. Чтобы создать формат внешнего файла, используйте CREATE EXTERNAL FILE FORMAT.
SCHEMA_NAME и OBJECT_NAME
Для использования только с эластичным запросом.
OBJECT_NAME Предложения SCHEMA_NAME сопоставляют определение внешней таблицы с таблицей в другой схеме. Если опущено, предполагается dbo, что схема удаленного объекта будет совпадать с заданным именем внешней таблицы. Это особенно необходимо, если имя удаленной таблицы уже занято в базе данных, где создается внешняя таблица. Например, вы хотите определить внешнюю таблицу для получения общего представления из представлений каталогов или динамических административных представлений, которые находятся на вашем развернутом уровне данных. Так как представления каталога и динамические административные представления уже существуют локально, их имена нельзя использовать для определения внешней таблицы. Вместо этого используйте другое имя и используйте имя представления каталога или имя dmV в SCHEMA_NAME предложениях и /или OBJECT_NAME . Пример см. в разделе Создание внешних таблиц.
РАСПРЕДЕЛЕНИЕ
Для использования только с эластичным запросом.
Необязательно. Этот аргумент требуется только для баз данных типа SHARD_MAP_MANAGER. Этот аргумент указывает, следует считать таблицу сегментированной или реплицированной. С SHARDED (<column name>) таблицами данные из разных таблиц не перекрываются.
REPLICATED указывает, что таблицы имеют одинаковые данные для каждого сегмента.
ROUND_ROBIN указывает, что для распределения данных используется метод, зависящий от приложения.
Предложение DISTRIBUTION указывает распределение данных, используемое для этой таблицы. Обработчик запросов использует сведения, предоставленные в DISTRIBUTION предложении, для создания наиболее эффективных планов запросов.
-
SHARDEDозначает, что данные горизонтально секционируются по базам данных. Ключ секционирования для распределения данных указывается в параметреsharding_column_name. -
REPLICATEDозначает, что идентичные копии таблицы присутствуют в каждой базе данных. Вы несете ответственность за то, чтобы реплики были идентичными в базах данных. -
ROUND_ROBINозначает, что таблица горизонтально разделена с помощью метода распределения, зависящего от приложения.
Разрешения
Пользователи, имеющие доступ к внешней таблице, автоматически получают доступ к базовой удаленной таблице с учетными данными, указанными в определении внешнего источника данных. Старайтесь избегать нежелательного повышения прав с использованием учетных данных для внешнего источника данных. Используйте GRANT или REVOKE для внешней таблицы, как если бы это обычная таблица. Определив внешний источник данных и внешние таблицы, вы можете использовать все возможности T-SQL для создания запросов к внешним таблицам.
CREATE EXTERNAL TABLE требуется следующие разрешения пользователя:
CREATE TABLEALTER ANY SCHEMAALTER ANY EXTERNAL DATA SOURCEALTER ANY EXTERNAL FILE FORMAT-
CONTROL DATABASEРазрешения необходимы для создания только главного ключа, учетных данных базы данных и внешнего источника данных.
Обратите внимание, что имя входа, создающее внешний источник данных, должно иметь разрешение на чтение и запись во внешний источник данных, расположенный в Hadoop или Хранилище BLOB-объектов Azure.
Внимание
Разрешение ALTER ANY EXTERNAL DATA SOURCE предоставляет любому субъекту возможность создавать и изменять любой объект внешнего источника данных, поэтому он также предоставляет возможность доступа ко всем учетным данным в области базы данных. Это разрешение следует рассматривать как высоко привилегированное, поэтому его следует предоставлять только доверенным субъектам в системе.
Блокировка
Общая блокировка SCHEMARESOLUTION объекта.
Замечания
В нерегламентированных сценариях запросов, таких как SELECT FROM EXTERNAL TABLEстроки, полученные из внешнего источника данных, хранятся во временной таблице. После завершения запроса строки удаляются, а временная таблица удаляется. В таблицах SQL не сохраняются постоянные данные.
Напротив, в сценарии импорта, например SELECT INTO FROM EXTERNAL TABLE, строки, полученные из внешнего источника данных, хранятся в виде постоянных данных в таблице SQL. Новая таблица создается во время выполнения запроса при извлечении внешних данных.
В настоящее время виртуализация данных с базой данных SQL Azure доступна только для чтения.
Вы можете создать несколько внешних таблиц, которые ссылаются на один или разные внешние источники данных.
Ограничения по ширине таблицы
Ограничение ширины строки в 1 МБ зависит от максимального размера одной допустимой строки по определению таблицы. Если сумма схемы столбца превышает 1 МБ, запросы виртуализации данных завершаются ошибкой.
Обработка ошибок
При выполнении CREATE EXTERNAL TABLE инструкции, если попытка подключения завершается ошибкой, оператор завершается сбоем и внешняя таблица не создается. Это может занять около минуты, поскольку база данных SQL повторяет попытки соединения, прежде чем запрос будет завершен ошибкой.
Ограничения
Так как данные для внешней таблицы не контролируются прямым управлением ядром СУБД или базой данных SQL Azure, его можно изменять или удалять в любое время внешним процессом. По этой причине результаты запроса к внешней таблице необязательно будут детерминированными. Один и то же запрос может возвращать разные результаты при каждом обращении к внешней таблице. Аналогичным образом, запрос может завершиться ошибкой, если внешние данные удалены или перемещены.
Вы можете создать несколько внешних таблиц, которые ссылаются на разные внешние источники данных.
Только эти инструкции DDL допускаются для внешних таблиц:
-
CREATE TABLEиDROP TABLE. -
CREATE STATISTICSиDROP STATISTICS. -
CREATE VIEWиDROP VIEW.
Неподдерживаемые конструкции и операции:
- Ограничение
DEFAULTдля столбцов внешней таблицы. - Удаление, вставка и обновление на языке обработки данных DML.
Ограничения с эластичным запросом
семантики изоляции. Доступ к данным через внешнюю таблицу не соответствует семантике изоляции в SQL Server. Это означает, что запрос внешней таблицы не накладывает блокировку или изоляцию моментальных снимков. Поэтому возврат данных может измениться, если данные во внешнем источнике данных изменяются. Один и то же запрос может возвращать разные результаты при каждом обращении к внешней таблице. Аналогичным образом, запрос может завершиться ошибкой, если внешние данные удалены или перемещены.
Конструкторы и операции не поддерживаются:
- Ограничение
DEFAULTдля столбцов внешней таблицы. - Удаление, вставка и обновление на языке обработки данных DML.
- Динамическое маскирование данных во внешних столбцах таблицы.
- Курсоры не поддерживаются для внешних таблиц в Базе данных SQL Azure.
- Ограничение
только литеральные предикаты: можно отправить только предикаты литерала, определенные в запросе, в внешний источник данных. Это в отличие от связанных серверов и доступа, где предикаты, определенные во время выполнения запроса, можно использовать, то есть при использовании с вложенным циклом в плане запроса. Это часто приводит к локальному копированию всей внешней таблицы, а затем присоединению.
В следующем примере, если
External.Ordersявляется внешней таблицей иCustomerявляется локальной таблицей, запрос копирует всю внешнюю таблицу локально, так как необходимый предикат не известен во время компиляции.SELECT Orders.OrderId, Orders.OrderTotal FROM External.Orders WHERE CustomerId IN ( SELECT TOP 1 CustomerId FROM Customer WHERE CustomerName = 'MyCompany' );Нет параллелизма. Использование внешних таблиц предотвращает использование параллелизма в плане запроса.
выполнение в виде удаленного запроса: внешние таблицы реализуются как удаленный запрос, поэтому предполагаемое количество возвращаемых строк обычно составляет 1000. Существуют другие правила на основе типа предиката, используемого для фильтрации внешней таблицы. Они представляют собой оценки на основе правил, а не на основе фактических данных во внешней таблице. Оптимизатор не обращается к удаленному источнику данных для получения более точной оценки.
Не поддерживается для частной конечной точки: запросы внешней таблицы не поддерживаются, если подключение к удаленной таблице является частной конечной точкой.
Примеры
Дополнительные примеры см. в статье CREATE EXTERNAL DATA SOURCE или virtualization Data virtualization with Azure SQL Database.
А. Создание внешней таблицы для эластичного запроса
CREATE EXTERNAL TABLE [dbo].[CustomerInformation]
(
[CustomerID] INT NOT NULL,
[CustomerName] VARCHAR (50) NOT NULL,
[Company] VARCHAR (50) NOT NULL
)
WITH (
DATA_SOURCE = MyElasticDBQueryDataSrc
);
В. Создание внешней таблицы для сегментированного источника данных
В этом примере удаленное динамическое административное представление переназначает внешнюю таблицу с помощью SCHEMA_NAME предложений и OBJECT_NAME предложений.
CREATE EXTERNAL TABLE [dbo].[all_dm_exec_requests]
(
[session_id] SMALLINT NOT NULL,
[request_id] INT NOT NULL,
[start_time] DATETIME NOT NULL,
[status] NVARCHAR (30) NOT NULL,
[command] NVARCHAR (32) NOT NULL,
[sql_handle] VARBINARY (64),
[statement_start_offset] INT,
[statement_end_offset] INT,
[cpu_time] INT NOT NULL
)
WITH (
DATA_SOURCE = MyExtSrc,
SCHEMA_NAME = 'sys',
OBJECT_NAME = 'dm_exec_requests',
DISTRIBUTION = ROUND_ROBIN
);
В. Запрос внешних данных из базы данных SQL Azure с внешней таблицей
Чтобы создать учетные данные базы данных в базе данных SQL Azure, сначала необходимо создать главный ключ базы данных, если он еще не существует. Главный ключ базы данных необходим, если учетные данные требуют
SECRET.-- Create MASTER KEY if it doesn't exist in the database: CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';Создайте учетные данные в области базы данных с помощью маркера SAS. Вы также можете использовать управляемое удостоверение.
CREATE DATABASE SCOPED CREDENTIAL MyCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<KEY>'; --Removing leading '?'Создайте внешний источник данных с помощью учетных данных.
--Create external data source pointing to the file path, and referencing database-scoped credential: CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource WITH ( LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest' CREDENTIAL = [MyCredential] );Создайте и
EXTERNAL TABLEвыполнитеEXTERNAL FILE FORMATзапрос к данным, как если бы локальная таблица.-- Or, create an EXTERNAL FILE FORMAT and an EXTERNAL TABLE --Create external file format CREATE EXTERNAL FILE FORMAT DemoFileFormat WITH ( FORMAT_TYPE = PARQUET ); --Create external table: CREATE EXTERNAL TABLE tbl_TaxiRides ( vendorID VARCHAR (100) COLLATE Latin1_General_BIN2, tpepPickupDateTime DATETIME2, tpepDropoffDateTime DATETIME2, passengerCount INT, tripDistance FLOAT, puLocationId VARCHAR (8000), doLocationId VARCHAR (8000), startLon FLOAT, startLat FLOAT, endLon FLOAT, endLat FLOAT, rateCodeId SMALLINT, storeAndFwdFlag VARCHAR (8000), paymentType VARCHAR (8000), fareAmount FLOAT, extra FLOAT, mtaTax FLOAT, improvementSurcharge VARCHAR (8000), tipAmount FLOAT, tollsAmount FLOAT, totalAmount FLOAT ) WITH ( DATA_SOURCE = NYCTaxiExternalDataSource, LOCATION = 'yellow/puYear = */puMonth = */*.parquet', FILE_FORMAT = MyFileFormat ); --Then, query the data via an external table with T-SQL: SELECT TOP 10 * FROM tbl_TaxiRides;
Связанный контент
* Azure Synapse
Аналитика*
Обзор: Azure Synapse Analytics
Внешняя таблица используется в следующих целях:
- Выделенные пулы SQL могут запрашивать, импортировать и хранить данные из Hadoop, Хранилище BLOB-объектов Azure и Azure Data Lake Storage 1-го поколения и 2-го поколения.
- Бессерверные пулы SQL могут запрашивать, импортировать и хранить данные из хранилища BLOB-объектов Azure и Azure Data Lake Storage 1-го поколения и 2-го поколения. Бессерверные не поддерживаются
TYPE=Hadoop.
См. также статью CREATE EXTERNAL DATA SOURCE and DROP EXTERNAL TABLE.
Дополнительные сведения и примеры использования внешних таблиц с Azure Synapse см. в статье "Использование внешних таблиц с Synapse SQL".
Синтаксис
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ ,...n ] )
WITH (
LOCATION = 'hdfs_folder_or_filepath',
DATA_SOURCE = external_data_source_name,
FILE_FORMAT = external_file_format_name
[ , <reject_options> [ ,...n ] ]
)
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
<reject_options> ::=
{
| REJECT_TYPE = { value | percentage },
| REJECT_VALUE = reject_value,
| REJECT_SAMPLE_VALUE = reject_sample_value,
| REJECTED_ROW_LOCATION = '/REJECT_Directory'
}
Аргументы
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
Имя создаваемой таблицы, состоящее из одной, двух или трех частей.
Для внешней таблицы только метаданные таблицы вместе с базовой статистикой о файле или папке, на которую ссылается Azure Data Lake, Hadoop или Хранилище BLOB-объектов Azure. При создании внешних таблиц фактические данные не перемещаются и не сохраняются.
Внимание
Для повышения производительности, если драйвер внешнего источника данных поддерживает трехкомпонентное имя, необходимо указать трехкомпонентное имя.
< > column_definition [ ,... n ]
CREATE EXTERNAL TABLE поддерживает возможность настройки имени столбца, типа данных, допустимости значений NULL и параметров сортировки. Нельзя использовать внешние DEFAULT CONSTRAINT таблицы.
Примечание.
Типы данных text, ntext и xml не поддерживаются для столбцов во внешних таблицах Для Synapse Analytics.
- При чтении файлов с разделителями определения столбцов, включая типы данных и количество столбцов, должны соответствовать данным во внешних файлах. Если есть несоответствие, строки файлов отклоняются при запросе фактических данных.
- При чтении из файлов Parquet можно указать только нужные столбцы, чтобы пропустить все остальные.
LOCATION = путь_к_папке_или_файлу
Указывает папку или путь к файлу и имя файла для фактических данных в Azure Data Lake, Hadoop или Хранилище BLOB-объектов Azure. Расположение начинается с корневой папки. Она представляет собой расположение данных, указанное во внешнем источнике данных. Инструкция CREATE EXTERNAL TABLE AS SELECT (CETAS) создает путь и папку, если она не существует.
CREATE EXTERNAL TABLE не создает путь к папке.
Если вы указываете LOCATION папку, запрос PolyBase, который выбирает внешнюю таблицу, извлекает файлы из папки и всех ее вложенных папок. Как и Hadoop, PolyBase не возвращает скрытые папки. Он также не возвращает файлы, для которых имя файла начинается с подчеркивания (_) или периода (.).
В следующем примере изображения, если LOCATION='/webdata/'запрос PolyBase возвращает строки из mydata.txt и mydata2.txt. Он не возвращается mydata3.txt , так как он находится в подпапке скрытой папки, и он не возвращается _hidden.txt , так как это скрытый файл.
В отличие от внешних таблиц Hadoop, собственные внешние таблицы не возвращают вложенные папки, если только не указано /** в конце пути. В этом примере, если LOCATION='/webdata/'запрос бессерверного пула SQL возвращает строки из mydata.txt. Он не возвращается mydata2.txt и mydata3.txt потому, что они находятся в вложенной папке. Таблицы Hadoop возвращают все файлы в любой вложенной папке.
Как Hadoop, так и собственные внешние таблицы пропускают файлы с именами, начинающимися с подчеркивания (_) или точки (.).
DATA_SOURCE = external_data_source_name
Указывает имя внешнего источника данных, содержащего расположение внешних данных. Это расположение находится в Azure Data Lake. Чтобы создать внешний источник данных, используйте CREATE EXTERNAL DATA SOURCE.
FILE_FORMAT = external_file_format_name
Указывает имя объекта формата внешнего файла, который хранит тип файла и метод сжатия для внешних данных. Чтобы создать формат внешнего файла, используйте CREATE EXTERNAL FILE FORMAT.
Параметры таблицы
Задает набор параметров, описывающих способ чтения используемых файлов. В настоящее время доступно {"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}только то, что указывает внешней таблице игнорировать обновления, сделанные в базовых файлах, даже если это может привести к некоторым несогласованным операциям чтения. Используйте этот параметр только в особых случаях, когда выполняется частое добавление файлов. Этот параметр доступен в бессерверном пуле SQL для формата CSV.
Параметры REJECT
Параметры отклонения доступны в предварительной версии для бессерверных пулов SQL в Azure Synapse Analytics.
Этот параметр можно использовать только с внешними источниками данных, где TYPE = HADOOP.
Можно указать параметры отклонения, определяющие, как PolyBase обрабатывает грязные записи, полученные из внешнего источника данных. Запись считается "грязной", если фактический тип данных или количество столбцов не совпадают с определениями столбцов во внешней таблице.
Если вы не указываете или не меняете значения отклонения, PolyBase использует значения по умолчанию. Эти сведения о параметрах отклонения хранятся в виде дополнительных метаданных при создании внешней таблицы с CREATE EXTERNAL TABLE оператором. Когда будущая SELECT инструкция или SELECT INTO SELECT инструкция выбирает данные из внешней таблицы, PolyBase использует параметры отклонения, чтобы определить количество или процент строк, которые могут быть отклонены до сбоя фактического запроса. Запрос возвращает (частичные) результаты до превышения порогового значения отклонения. Затем он выдаст соответствующее сообщение об ошибке.
Параметр форматирования PARSER_VERSION поддерживается только в бессерверных пулах SQL.
REJECT_TYPE = { значение | процент }
Указывает, указан литерал REJECT_VALUE или процент.
значение
REJECT_VALUE— это литеральное значение, а не процент. Запрос PolyBase завершается ошибкой, если число отклоненных строк превышает reject_value.Запрос завершается ошибкой, если число отклоненных строк превышает reject_value. Например, если
REJECT_VALUE = 5иREJECT_TYPE = value, запрос PolyBaseSELECTзавершается сбоем после того, как пять строк отклоняются.процент
REJECT_VALUE— это процент, а не литеральное значение. Запрос PolyBase завершается ошибкой, если процент неудачных строк превышает reject_value. Процент недопустимых строк вычисляется с интервалами.- Для
REJECT_TYPE = value, reject_value должно быть целым числом от 0 до 2 147 483 647. - Для
REJECT_TYPE = percentage, reject_value должен быть плавающей в диапазоне от 0 до 100. Процент действителен только для выделенных пулов SQL, гдеTYPE = HADOOP.
- Для
REJECT_SAMPLE_VALUE = reject_sample_value
Этот атрибут требуется при указании REJECT_TYPE = percentage. Он определяет количество строк, которое запрос попытается извлечь, прежде чем PolyBase пересчитает процент отклоненных строк.
Параметр reject_sample_value должен быть целым числом от 0 до 2 147 483 647.
Например, если REJECT_SAMPLE_VALUE = 1000PolyBase вычисляет процент неудачных строк после попытки импортировать 1000 строк из внешнего файла данных. Если процент неудачных строк меньше reject_value, PolyBase пытается получить еще 1000 строк. Он продолжает пересчитывать процент неудачных строк после попытки импортировать все дополнительные 1000 строк.
Примечание.
Поскольку PolyBase вычисляет процент отклоненных строк с интервалами, фактический процент отклоненных строк может превысить reject_value.
Пример
В этом примере показано, как три REJECT варианта взаимодействуют друг с другом. Например, если REJECT_TYPE = percentage, REJECT_VALUE = 30и REJECT_SAMPLE_VALUE = 100может произойти следующий сценарий:
- PolyBase попытается извлечь первые 100 строк; из них 25 отклонено, а 75 — извлечено успешно.
- Процент строк с ошибками равен 25 %, что меньше значения отклонения — 30 %. В результате PolyBase продолжает получать данные из внешнего источника данных.
- PolyBase пытается загрузить следующие 100 строк. На этот раз 25 строк извлечено успешно и 75 — отклонено.
- Процент отклоненных строк пересчитывается и составляет 50 %. Процент отклоненных строк превысил значение отклонения 30 %.
- Запрос PolyBase завершается ошибкой, поскольку после попытки извлечение первых 200 строк 50 % из них было отклонено. Соответствующие строки возвращаются до того, как запрос PolyBase обнаруживает превышение порогового значения отклонения.
REJECTED_ROW_LOCATION = расположение каталога
Указывает каталог во внешнем источнике данных, в который должны записываться строки и соответствующий файл ошибок.
Если указанный путь не существует, он создается. Дочерний каталог создается с именем _rejectedrows. Символ _ гарантирует, что каталог экранируется для другой обработки данных, если не указано явно в параметре расположения.
- В бессерверных пулах SQL путь —
YearMonthDay_HourMinuteSecond_StatementIDэто путь. Вы можете использоватьstatementIDдля сопоставления папки с созданным запросом. - В выделенных пулах SQL создается путь на основе времени отправки нагрузки в формате
YearMonthDay -HourMinuteSecond, например20180330-173205.
В этой папке записываются два типа файлов, _reason файл и файл данных.
Дополнительные сведения см. в разделе CREATE EXTERNAL DATA SOURCE.
Как файлы причин, так и файлы данных имеют идентификаторы queryID, связанные с инструкцией CTAS. Так как данные и причины хранятся в отдельных файлах, эти файлы имеют соответствующие суффиксы.
В бессерверных пулах error.json SQL файл содержит массив JSON с возникшими ошибками, связанными с отклоненными строками. Каждый элемент, представляющий ошибку, имеет следующие атрибуты:
| Атрибут | Описание |
|---|---|
Error |
Причина, по которой строка отклонена. |
Row |
Порядковый номер отклоненной строки в файле. |
Column |
Порядковый номер отклоненного столбца. |
Value |
Значение отклоненного столбца. Если значение больше 100 символов, отображаются только первые 100 символов. |
File |
Путь к файлу, которому принадлежит строка. |
Разрешения
Требуются следующие разрешения:
CREATE TABLEALTER ANY SCHEMAALTER ANY EXTERNAL DATA SOURCEALTER ANY EXTERNAL FILE FORMAT-
CONTROL DATABASEРазрешения необходимы для создания только главного ключа, учетных данных базы данных и внешнего источника данных.
Обратите внимание, что имя входа, создающее внешний источник данных, должно иметь разрешение на чтение и запись во внешний источник данных, расположенный в Hadoop или Хранилище BLOB-объектов Azure.
Внимание
Разрешение ALTER ANY EXTERNAL DATA SOURCE предоставляет любому субъекту возможность создавать и изменять любой объект внешнего источника данных, поэтому он также предоставляет возможность доступа ко всем учетным данным в области базы данных. Это разрешение следует рассматривать как высоко привилегированное, поэтому его следует предоставлять только доверенным субъектам в системе.
Обработка ошибок
При выполнении инструкции CREATE EXTERNAL TABLE PolyBase пытается подключиться к внешнему источнику данных. Если попытка подключения завершается ошибкой, оператор завершается ошибкой, и внешняя таблица не создается. Это может занять около минуты, поскольку PolyBase повторяет попытки соединения, прежде чем запрос будет завершен ошибкой.
Замечания
В нерегламентированных сценариях запросов, таких как SELECT FROM EXTERNAL TABLEPolyBase, хранит строки, полученные из внешнего источника данных во временной таблице. После выполнения запроса PolyBase удаляет временную таблицу. В таблицах SQL не сохраняются постоянные данные.
Напротив, в сценарии импорта, например SELECT INTO FROM EXTERNAL TABLEPolyBase, сохраняет строки, полученные из внешнего источника данных, в качестве постоянных данных в таблице SQL. Новая таблица создается при выполнении запросов, когда PolyBase извлекает внешние данные.
PolyBase может передать некоторые вычисления запросов в Hadoop для повышения производительности запросов. Это действие называется pushdown предикатом. Для его выполнения задайте параметр расположения диспетчера ресурсов Hadoop в CREATE EXTERNAL DATA SOURCE.
Вы можете создать несколько внешних таблиц, которые ссылаются на один или разные внешние источники данных.
Бессерверные и выделенные пулы SQL в Azure Synapse Analytics используют различные базы кода для виртуализации данных. Бессерверные пулы SQL поддерживают собственную технологию виртуализации данных. Выделенные пулы SQL поддерживают как собственную, так и виртуализацию данных PolyBase. Виртуализация данных PolyBase используется при EXTERNAL DATA SOURCE создании с TYPE=HADOOPпомощью .
Ограничения
Так как данные для внешней таблицы не контролируются прямым управлением Azure Synapse, их можно изменять или удалять в любое время внешним процессом. По этой причине результаты запроса к внешней таблице необязательно будут детерминированными. Один и то же запрос может возвращать разные результаты при каждом обращении к внешней таблице. Аналогичным образом, запрос может завершиться ошибкой, если внешние данные удалены или перемещены.
Внешние таблицы не поддерживают исходные данные с параметрами сортировки UTF-8. Если исходные данные используют параметры сортировки UTF-8, необходимо явно назначить параметры сортировки, отличные от UTF-8, каждому столбцу UTF-8 в инструкции CREATE EXTERNAL TABLE . Не удается сделать это, это приведет к возникновению сообщения об ошибке, аналогичному следующим выходным данным:
Msg 105105, Level 16, State 1, Line 22
105105;No column collation was specified in external table definition and the collation of current database 'Latin1_General_100_CI_AS_SC_UTF8' is not supported for external tables of type 'HADOOP'. Please specify a supported collation in the column definition.
Если параметры сортировки базы данных внешней таблицы являются UTF-8, создание таблицы завершается ошибкой, если только каждый столбец не определен явным образом с параметрами сортировки, отличной от UTF-8 (например, [UTF8_column] VARCHAR(128) COLLATE LATIN1_GENERAL_100_CI_AS_KS_WS NOT NULL).
Вы можете создать несколько внешних таблиц, которые ссылаются на разные внешние источники данных.
Только эти инструкции DDL допускаются для внешних таблиц:
-
CREATE TABLEиDROP TABLE. -
CREATE STATISTICSиDROP STATISTICS. -
CREATE VIEWиDROP VIEW.
Неподдерживаемые конструкции и операции:
- Ограничение
DEFAULTна столбцы внешней таблицы - Операции DML обновления, вставки и удаления
- Динамическое маскирование данных во внешних столбцах таблицы
Ограничения запросов
Рекомендуется не превышать не более 30 тысяч файлов на папку. Если ссылка на слишком много файлов, исключение из памяти виртуальной машины Java (JVM) может произойти или производительность может снизиться.
Ограничения по ширине таблицы
В PolyBase в хранилище данных Azure ширина строки должна составлять не более 1 МБ в связи с максимальным размером допустимой строки в определении таблицы. Если схема суммы столбцов превышает 1 МБ, PolyBase не сможет запросить данные.
Ограничения типов данных
В внешних таблицах PolyBase нельзя использовать следующие типы данных:
- географии
- геометрии
- hierarchyid (идентификатор иерархии)
- изображения
- текст
- ntext
- XML-
- Любой пользовательский тип
Блокировка
Общая блокировка SCHEMARESOLUTION объекта.
Примеры
А. Импорт данных из ADLS 2-го поколения в Azure Synapse Analytics
Примеры для ADLS 1-го поколения см. в статье Создание внешнего источника данных.
-- These values come from your Azure Active Directory Application used to authenticate to ADLS Gen 2.
CREATE DATABASE SCOPED CREDENTIAL ADLUser
WITH
IDENTITY = '<clientID>@\<OAuth2.0TokenEndPoint>',
SECRET = '<KEY>';
GO
CREATE EXTERNAL DATA SOURCE AzureDataLakeStore
WITH (
TYPE = HADOOP,
LOCATION = 'abfss://data@pbasetr.azuredatalakestore.net'
);
GO
CREATE EXTERNAL FILE FORMAT TextFileFormat
WITH (
FORMAT_TYPE = DELIMITEDTEXT,
FORMAT_OPTIONS (
FIELD_TERMINATOR = '|',
STRING_DELIMITER = '',
DATE_FORMAT = 'yyyy-MM-dd HH:mm:ss.fff',
USE_TYPE_DEFAULT = FALSE
)
);
GO
CREATE EXTERNAL TABLE [dbo].[DimProduct_external]
(
[ProductKey] INT NOT NULL,
[ProductLabel] NVARCHAR NULL,
[ProductName] NVARCHAR NULL
)
WITH (
DATA_SOURCE = AzureDataLakeStore,
LOCATION = '/DimProduct/',
FILE_FORMAT = TextFileFormat,
REJECT_TYPE = value,
REJECT_VALUE = 0
);
GO
CREATE TABLE [dbo].[DimProduct]
WITH (DISTRIBUTION = HASH([ProductKey])) AS
GO
SELECT *
FROM [dbo].[DimProduct_external];
В. Импорт данных из Parquet в Azure Synapse Analytics
В следующем примере создается внешняя таблица. Затем он возвращает первую строку:
CREATE EXTERNAL TABLE census_external_table
(
decennialTime VARCHAR (20),
stateName VARCHAR (100),
countyName VARCHAR (100),
population INT,
race VARCHAR (50),
sex VARCHAR (10),
minAge INT,
maxAge INT
)
WITH (
DATA_SOURCE = population_ds,
LOCATION = '/parquet/',
FILE_FORMAT = census_file_format
);
GO
SELECT TOP 1 *
FROM census_external_table;
Связанный контент
- СОЗДАТЬ ВНЕШНИЙ ИСТОЧНИК ДАННЫХ
- CREATE EXTERNAL FILE FORMAT (Transact-SQL)
- CREATE EXTERNAL TABLE AS SELECT (Создать внешнюю таблицу как SELECT)
- CREATE TABLE AS SELECT (Создать таблицу как SELECT)
*Аналитика
Платформа (PDW) *
Обзор: система платформы аналитики
Внешняя таблица используется в следующих целях:
- Запрос данных из Hadoop или Хранилища BLOB-объектов Azure с помощью инструкций Transact-SQL.
- Импорт и хранение данных из Hadoop или Хранилище BLOB-объектов Azure в систему платформы Аналитики.
См. также статью CREATE EXTERNAL DATA SOURCE and DROP EXTERNAL TABLE.
Синтаксис
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ , ...n ] )
WITH (
LOCATION = 'hdfs_folder_or_filepath' ,
DATA_SOURCE = external_data_source_name ,
FILE_FORMAT = external_file_format_name
[ , <reject_options> [ , ...n ] ]
)
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
<reject_options> ::=
{
| REJECT_TYPE = { value | percentage },
| REJECT_VALUE = reject_value ,
| REJECT_SAMPLE_VALUE = reject_sample_value ,
}
Аргументы
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
Имя создаваемой таблицы, состоящее из одной, двух или трех частей.
Для внешней таблицы система платформы Аналитики хранит только метаданные таблицы, а также базовую статистику о файле или папке, на которую ссылается Hadoop или Хранилище BLOB-объектов Azure. Никакие данные не перемещаются и не хранятся в Системе платформы аналитики.
Внимание
Для повышения производительности, если драйвер внешнего источника данных поддерживает трехкомпонентное имя, необходимо указать трехкомпонентное имя.
< > column_definition [ ,... n ]
CREATE EXTERNAL TABLE поддерживает возможность настройки имени столбца, типа данных, допустимости значений NULL и параметров сортировки. Нельзя использовать внешние DEFAULT CONSTRAINT таблицы.
Определения столбцов, включая типы данных и количество столбцов, должны соответствовать данным во внешних файлах. Если есть несоответствие, строки файлов отклоняются при запросе фактических данных.
LOCATION = путь_к_папке_или_файлу
Указывает путь к папке или файлу и имя файла для фактических данных в Хранилище BLOB-объектов Azure или Hadoop. Расположение начинается с корневой папки. Она представляет собой расположение данных, указанное во внешнем источнике данных.
В системе платформы аналитики инструкция CREATE EXTERNAL TABLE AS SELECT (CETAS) создает путь и папку, если она не существует.
CREATE EXTERNAL TABLE не создает путь к папке.
Если вы указываете LOCATION папку, запрос PolyBase, который выбирает внешнюю таблицу, извлекает файлы из папки и всех ее вложенных папок. Как и Hadoop, PolyBase не возвращает скрытые папки. Он также не возвращает файлы, для которых имя файла начинается с подчеркивания (_) или периода (.).
В следующем примере изображения, если LOCATION='/webdata/'запрос PolyBase возвращает строки из mydata.txt и mydata2.txt. Он не возвращается mydata3.txt , так как он находится в подпапке скрытой папки, и он не возвращается _hidden.txt , так как это скрытый файл.
Чтобы изменить значение по умолчанию и считывать данные только из корневой папки, установите для атрибута <polybase.recursive.traversal> значение false в файле конфигурации core-site.xml. Этот файл находится под <SqlBinRoot>\PolyBase\Hadoop\Conf\ корнем bin SQL Server. Например, C:\Program Files\Microsoft SQL Server\MSSQL13.XD14\MSSQL\Binn\.
DATA_SOURCE = external_data_source_name
Указывает имя внешнего источника данных, содержащего расположение внешних данных. Это расположение — Hadoop или Хранилище BLOB-объектов Azure. Чтобы создать внешний источник данных, используйте CREATE EXTERNAL DATA SOURCE.
FILE_FORMAT = external_file_format_name
Указывает имя объекта формата внешнего файла, который хранит тип файла и метод сжатия для внешних данных. Чтобы создать формат внешнего файла, используйте CREATE EXTERNAL FILE FORMAT.
Параметры REJECT
Этот параметр можно использовать только с внешними источниками данных, где TYPE = HADOOP.
Можно указать параметры отклонения, определяющие, как PolyBase обрабатывает грязные записи, полученные из внешнего источника данных. Запись считается "грязной", если фактический тип данных или количество столбцов не совпадают с определениями столбцов во внешней таблице.
Если вы не указываете или не меняете значения отклонения, PolyBase использует значения по умолчанию. Эти сведения о параметрах отклонения хранятся в виде дополнительных метаданных при создании внешней таблицы с CREATE EXTERNAL TABLE оператором. Когда будущая SELECT инструкция или SELECT INTO SELECT инструкция выбирает данные из внешней таблицы, PolyBase использует параметры отклонения, чтобы определить количество или процент строк, которые могут быть отклонены до сбоя фактического запроса. Запрос возвращает (частичные) результаты до превышения порогового значения отклонения. Затем он выдаст соответствующее сообщение об ошибке.
REJECT_TYPE = { значение | процент }
Указывает, указан литерал REJECT_VALUE или процент.
значение
REJECT_VALUE— это литеральное значение, а не процент. Запрос PolyBase завершается ошибкой, если число отклоненных строк превышает reject_value.Например, если
REJECT_VALUE = 5иREJECT_TYPE = value, запрос PolyBaseSELECTзавершается сбоем после того, как пять строк отклоняются.процент
REJECT_VALUE— это процент, а не литеральное значение. Запрос PolyBase завершается ошибкой, если процент неудачных строк превышает reject_value. Процент недопустимых строк вычисляется с интервалами.
REJECT_VALUE = reject_value
Задает значение или процент строк, которые можно отклонить, прежде чем запрос завершится ошибкой.
Для REJECT_TYPE = value, reject_value должно быть целым числом от 0 до 2 147 483 647.
Для REJECT_TYPE = percentage, reject_value должен быть плавающей в диапазоне от 0 до 100.
REJECT_SAMPLE_VALUE = reject_sample_value
Этот атрибут требуется при указании REJECT_TYPE = percentage. Он определяет количество строк, которое запрос попытается извлечь, прежде чем PolyBase пересчитает процент отклоненных строк.
Параметр reject_sample_value должен быть целым числом от 0 до 2 147 483 647.
Например, если REJECT_SAMPLE_VALUE = 1000PolyBase вычисляет процент неудачных строк после попытки импортировать 1000 строк из внешнего файла данных. Если процент неудачных строк меньше reject_value, PolyBase пытается получить еще 1000 строк. Он продолжает пересчитывать процент неудачных строк после попытки импортировать все дополнительные 1000 строк.
Примечание.
Поскольку PolyBase вычисляет процент отклоненных строк с интервалами, фактический процент отклоненных строк может превысить reject_value.
Пример
В этом примере показано, как три REJECT варианта взаимодействуют друг с другом. Например, если REJECT_TYPE = percentage, REJECT_VALUE = 30и REJECT_SAMPLE_VALUE = 100может произойти следующий сценарий:
- PolyBase попытается извлечь первые 100 строк; из них 25 отклонено, а 75 — извлечено успешно.
- Процент строк с ошибками равен 25 %, что меньше значения отклонения — 30 %. В результате PolyBase продолжает получать данные из внешнего источника данных.
- PolyBase пытается загрузить следующие 100 строк. На этот раз 25 строк извлечено успешно и 75 — отклонено.
- Процент отклоненных строк пересчитывается и составляет 50 %. Процент отклоненных строк превысил значение отклонения 30 %.
- Запрос PolyBase завершается ошибкой, поскольку после попытки извлечение первых 200 строк 50 % из них было отклонено. Соответствующие строки возвращаются до того, как запрос PolyBase обнаруживает превышение порогового значения отклонения.
Разрешения
Требуются следующие разрешения:
CREATE TABLEALTER ANY SCHEMAALTER ANY EXTERNAL DATA SOURCEALTER ANY EXTERNAL FILE FORMATCONTROL DATABASE
Обратите внимание, что имя входа, создающее внешний источник данных, должно иметь разрешение на чтение и запись во внешний источник данных, расположенный в Hadoop или Хранилище BLOB-объектов Azure.
Внимание
Разрешение ALTER ANY EXTERNAL DATA SOURCE предоставляет любому субъекту возможность создавать и изменять любой объект внешнего источника данных, поэтому он также предоставляет возможность доступа ко всем учетным данным в области базы данных. Это разрешение следует рассматривать как высоко привилегированное, поэтому его следует предоставлять только доверенным субъектам в системе.
Обработка ошибок
При выполнении инструкции CREATE EXTERNAL TABLE PolyBase пытается подключиться к внешнему источнику данных. Если попытка подключения завершается ошибкой, оператор завершается ошибкой, и внешняя таблица не создается. Это может занять около минуты, поскольку PolyBase повторяет попытки соединения, прежде чем запрос будет завершен ошибкой.
Замечания
В нерегламентированных сценариях запросов, таких как SELECT FROM EXTERNAL TABLEPolyBase, хранит строки, полученные из внешнего источника данных во временной таблице. После выполнения запроса PolyBase удаляет временную таблицу. В таблицах SQL не сохраняются постоянные данные.
Напротив, в сценарии импорта, например SELECT INTO FROM EXTERNAL TABLEPolyBase, сохраняет строки, полученные из внешнего источника данных, в качестве постоянных данных в таблице SQL. Новая таблица создается при выполнении запросов, когда PolyBase извлекает внешние данные.
PolyBase может передать некоторые вычисления запросов в Hadoop для повышения производительности запросов. Это действие называется pushdown предикатом. Для его выполнения задайте параметр расположения диспетчера ресурсов Hadoop в CREATE EXTERNAL DATA SOURCE.
Вы можете создать несколько внешних таблиц, которые ссылаются на один или разные внешние источники данных.
Ограничения
Так как данные для внешней таблицы не контролируются прямым управлением устройством, его можно изменять или удалять в любое время внешним процессом. По этой причине результаты запроса к внешней таблице необязательно будут детерминированными. Один и то же запрос может возвращать разные результаты при каждом обращении к внешней таблице. Аналогичным образом, запрос может завершиться ошибкой, если внешние данные удалены или перемещены.
Вы можете создать несколько внешних таблиц, которые ссылаются на разные внешние источники данных. Если же вы одновременно выполняете запросы к различным источникам данных Hadoop, каждый источник Hadoop должен иметь одинаковый параметр конфигурации сервера hadoop connectivity. Например, невозможно одновременно выполнить запрос к кластеру Cloudera Hadoop и кластеру Hortonworks Hadoop, поскольку они используют разные параметры конфигурации. Параметры конфигурации и поддерживаемые сочетания см. в разделе "Конфигурация подключения PolyBase".
Только эти инструкции DDL допускаются для внешних таблиц:
-
CREATE TABLEиDROP TABLE. -
CREATE STATISTICSиDROP STATISTICS. -
CREATE VIEWиDROP VIEW.
Неподдерживаемые конструкции и операции:
- Ограничение
DEFAULTна столбцы внешней таблицы - Операции DML обновления, вставки и удаления
- Динамическое маскирование данных во внешних столбцах таблицы
Ограничения запросов
PolyBase может обработать не более 33 тысяч файлов на папку при выполнении параллельных запросов PolyBase со степенью 32. Это максимальное число включает файлы и вложенные папки в каждой папке HDFS. Если степень параллелизма меньше 32, пользователь может выполнять запросы PolyBase к папкам в HDFS, если в них содержится более 33 тысяч файлов. Рекомендуется указывать короткие пути к внешним файлам и следить за тем, чтобы в каждой папке HDFS было не более 30 тысяч файлов. При ссылке на слишком большое число файлов может возникнуть исключение, связанное с нехваткой памяти на виртуальной машине Java.
Ограничения по ширине таблицы
В SQL Server 2016 (13.x) PolyBase имеет ограничение ширины строки в 32 КБ на основе максимального размера одной допустимой строки по определению таблицы. Если схема суммы столбцов превышает 32 КБ, PolyBase не сможет запросить данные.
В Azure Synapse Analytics это ограничение было увеличено до 1 МБ.
Ограничения типов данных
В внешних таблицах PolyBase нельзя использовать следующие типы данных:
- географии
- геометрии
- hierarchyid (идентификатор иерархии)
- изображения
- текст
- ntext
- XML-
- Любой пользовательский тип
Блокировка
Общая блокировка SCHEMARESOLUTION объекта.
Безопасность
Файлы данных для внешней таблицы хранятся в Hadoop или Хранилище BLOB-объектов Azure. Эти файлы данных создаются и управляются вашими собственными процессами. Это ваша ответственность за управление безопасностью внешних данных.
Примеры
А. Соединение данных HDFS с данными Системы платформы аналитики
SELECT cs.user_ip
FROM ClickStream AS cs
INNER JOIN [User] AS u
ON cs.user_ip = u.user_ip
WHERE cs.url = 'www.microsoft.com';
В. Импорт данных строк из HDFS в распределенную таблицу Системы платформы аналитики
CREATE TABLE ClickStream_PDW
WITH (DISTRIBUTION = HASH(url)) AS
SELECT url,
event_date,
user_ip
FROM ClickStream;
В. Импорт данных строк из HDFS в реплицированную таблицу Системы платформы аналитики
CREATE TABLE ClickStream_PDW
WITH (DISTRIBUTION = REPLICATE) AS
SELECT url,
event_date,
user_ip
FROM ClickStream;
Связанный контент
* Управляемый экземпляр SQL Azure *
Обзор: Управляемый экземпляр SQL Azure
Создает внешнюю таблицу данных в Управляемый экземпляр SQL Azure. Полные сведения см. в статье о виртуализации данных с помощью Управляемый экземпляр SQL Azure.
Виртуализация данных в Управляемом экземпляре SQL Azure обеспечивает доступ к внешним данным в нескольких форматах файлов в Azure Data Lake Storage 2-го поколения или хранилище BLOB-объектов Azure, а также запрашивать их с помощью инструкций T-SQL, даже сочетая данные с локально хранимыми реляционными данными с помощью соединений.
См. также статью CREATE EXTERNAL DATA SOURCE and DROP EXTERNAL TABLE.
Синтаксис
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ , ...n ] )
WITH (
LOCATION = 'filepath' ,
DATA_SOURCE = external_data_source_name ,
FILE_FORMAT = external_file_format_name
)
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
Аргументы
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
Имя создаваемой таблицы, состоящее из одной, двух или трех частей.
Для внешней таблицы только метаданные таблицы вместе с базовой статистикой о файле или папке, на которую ссылается Azure Data Lake или Хранилище BLOB-объектов Azure. При создании внешних таблиц фактические данные не перемещаются и не сохраняются.
Внимание
Для повышения производительности, если драйвер внешнего источника данных поддерживает трехкомпонентное имя, необходимо указать трехкомпонентное имя.
< > column_definition [ ,... n ]
CREATE EXTERNAL TABLE поддерживает возможность настройки имени столбца, типа данных, допустимости значений NULL и параметров сортировки. Нельзя использовать внешние DEFAULT CONSTRAINT таблицы.
Определения столбцов, включая типы данных и количество столбцов, должны соответствовать данным во внешних файлах. Если есть несоответствие, строки файлов отклоняются при запросе фактических данных.
LOCATION = путь_к_папке_или_файлу
Указывает папку или путь к файлу и имя файла для фактических данных в Azure Data Lake или Хранилище BLOB-объектов Azure. Расположение начинается с корневой папки. Она представляет собой расположение данных, указанное во внешнем источнике данных.
CREATE EXTERNAL TABLE не создает путь к папке.
Если вы указываете LOCATION папку, запрос из Управляемого экземпляра SQL Azure, который выбирает из внешней таблицы, извлекает файлы из папки, но не все ее вложенные папки.
Управляемый экземпляр SQL Azure не может находить файлы в вложенных папках или скрытых папках. Он также не возвращает файлы, для которых имя файла начинается с подчеркивания (_) или периода (.).
В следующем примере изображения, если LOCATION='/webdata/'запрос возвращает строки из mydata.txt. Он не возвращаетсяmydata2.txt, так как он находится в подпапке, он не возвращается, так как он находится в скрытой папке, и он не возвращается _hidden.txtmydata3.txt, так как это скрытый файл.
DATA_SOURCE = external_data_source_name
Указывает имя внешнего источника данных, содержащего расположение внешних данных. Это расположение находится в Azure Data Lake. Чтобы создать внешний источник данных, используйте CREATE EXTERNAL DATA SOURCE.
FILE_FORMAT = external_file_format_name
Указывает имя объекта формата внешнего файла, который хранит тип файла и метод сжатия для внешних данных. Чтобы создать формат внешнего файла, используйте CREATE EXTERNAL FILE FORMAT.
Разрешения
Требуются следующие разрешения:
CREATE TABLEALTER ANY SCHEMAALTER ANY EXTERNAL DATA SOURCEALTER ANY EXTERNAL FILE FORMAT-
CONTROL DATABASEРазрешения необходимы для создания только главного ключа, учетных данных базы данных и внешнего источника данных.
Обратите внимание, что имя входа, создающее внешний источник данных, должно иметь разрешение на чтение и запись во внешний источник данных, расположенный в Hadoop или Хранилище BLOB-объектов Azure.
Внимание
Разрешение ALTER ANY EXTERNAL DATA SOURCE предоставляет любому субъекту возможность создавать и изменять любой объект внешнего источника данных, поэтому он также предоставляет возможность доступа ко всем учетным данным в области базы данных. Это разрешение следует рассматривать как высоко привилегированное, поэтому его следует предоставлять только доверенным субъектам в системе.
Замечания
В нерегламентированных сценариях запросов, таких как SELECT FROM EXTERNAL TABLEстроки, полученные из внешнего источника данных, хранятся во временной таблице. После завершения запроса строки удаляются, а временная таблица удаляется. В таблицах SQL не сохраняются постоянные данные.
Напротив, в сценарии импорта, например SELECT INTO FROM EXTERNAL TABLE, строки, полученные из внешнего источника данных, хранятся в виде постоянных данных в таблице SQL. Новая таблица создается во время выполнения запроса при извлечении внешних данных.
В настоящее время виртуализация данных с Управляемый экземпляр SQL Azure доступна только для чтения.
Вы можете создать несколько внешних таблиц, которые ссылаются на один или разные внешние источники данных.
Ограничения
Так как данные для внешней таблицы не контролируются прямым контролем управляемого экземпляра SQL Azure, его можно изменять или удалять в любое время внешним процессом. По этой причине результаты запроса к внешней таблице необязательно будут детерминированными. Один и то же запрос может возвращать разные результаты при каждом обращении к внешней таблице. Аналогичным образом, запрос может завершиться ошибкой, если внешние данные удалены или перемещены.
Вы можете создать несколько внешних таблиц, которые ссылаются на разные внешние источники данных.
Только эти инструкции DDL допускаются для внешних таблиц:
-
CREATE TABLEиDROP TABLE. -
CREATE STATISTICSиDROP STATISTICS. -
CREATE VIEWиDROP VIEW.
Неподдерживаемые конструкции и операции:
- Ограничение
DEFAULTдля столбцов внешней таблицы - Операции DML обновления, вставки и удаления
Ограничения по ширине таблицы
Ограничение ширины строки в 1 МБ зависит от максимального размера одной допустимой строки по определению таблицы. Если сумма схемы столбца превышает 1 МБ, запросы виртуализации данных завершаются ошибкой.
Ограничения типов данных
Следующие типы данных нельзя использовать во внешних таблицах в Управляемом экземпляре SQL Azure:
- географии
- геометрии
- hierarchyid (идентификатор иерархии)
- изображения
- текст
- ntext
- XML-
- json
- Любой пользовательский тип
Блокировка
Общая блокировка SCHEMARESOLUTION объекта.
Примеры
А. Запрос внешних данных из Управляемый экземпляр SQL Azure с внешней таблицей
Дополнительные примеры см. в статье CREATE EXTERNAL DATA SOURCE или virtualization Data virtualization with Azure SQL Managed Instance.
Создайте главный ключ базы данных, если он не существует.
-- Optional: Create MASTER KEY if it doesn't exist in the database: CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';Создайте учетные данные в области базы данных с помощью маркера SAS. Вы также можете использовать управляемое удостоверение.
CREATE DATABASE SCOPED CREDENTIAL MyCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<KEY>'; --Removing leading '?'Создайте внешний источник данных с помощью учетных данных.
--Create external data source pointing to the file path, and referencing database-scoped credential: CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource WITH ( LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest' CREDENTIAL = [MyCredential] );Создайте и
EXTERNAL TABLEвыполнитеEXTERNAL FILE FORMATзапрос к данным, как если бы это локальная таблица.-- Or, create an EXTERNAL FILE FORMAT and an EXTERNAL TABLE --Create external file format CREATE EXTERNAL FILE FORMAT DemoFileFormat WITH ( FORMAT_TYPE = PARQUET ); --Create external table: CREATE EXTERNAL TABLE tbl_TaxiRides ( vendorID VARCHAR (100) COLLATE Latin1_General_BIN2, tpepPickupDateTime DATETIME2, tpepDropoffDateTime DATETIME2, passengerCount INT, tripDistance FLOAT, puLocationId VARCHAR (8000), doLocationId VARCHAR (8000), startLon FLOAT, startLat FLOAT, endLon FLOAT, endLat FLOAT, rateCodeId SMALLINT, storeAndFwdFlag VARCHAR (8000), paymentType VARCHAR (8000), fareAmount FLOAT, extra FLOAT, mtaTax FLOAT, improvementSurcharge VARCHAR (8000), tipAmount FLOAT, tollsAmount FLOAT, totalAmount FLOAT ) WITH ( DATA_SOURCE = NYCTaxiExternalDataSource, LOCATION = 'yellow/puYear = */puMonth = */*.parquet', FILE_FORMAT = MyFileFormat ); --Then, query the data via an external table with T-SQL: SELECT TOP 10 * FROM tbl_TaxiRides;
Связанный контент
Дополнительные сведения о внешних таблицах и связанных с ними понятиях см. в следующих статьях:
Обзор: Microsoft Fabric
Область применения: хранилище данных Microsoft Fabric
Дополнительные сведения и примеры для хранилища данных Fabric см. в следующих примерах OPENROWSET :
* Fabric SQL база данных *
Обзор: база данных SQL в Microsoft Fabric
Создает внешнюю таблицу.
Для использования с виртуализацией данных (предварительная версия).
Синтаксис
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ , ...n ] )
WITH (
LOCATION = 'filepath' ,
DATA_SOURCE = external_data_source_name ,
FILE_FORMAT = external_file_format_name
)
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
Аргументы
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
Имя создаваемой таблицы, состоящее из одной, двух или трех частей.
Для внешней таблицы SQL сохраняет только метаданные таблицы, а также базовую статистику о файле или папке. Фактические данные не перемещаются или хранятся в базе данных SQL в Fabric при создании внешних таблиц.
Внимание
Для повышения производительности, если драйвер внешнего источника данных поддерживает трехкомпонентное имя, необходимо указать трехкомпонентное имя.
< > column_definition [ ,... n ]
CREATE EXTERNAL TABLE поддерживает возможность настройки имени столбца, типа данных, допустимости значений NULL и параметров сортировки. Нельзя использовать внешние DEFAULT CONSTRAINT таблицы. Эти типы данных не поддерживаются для столбцов во внешних таблицах:
- географии
- геометрии
- hierarchyid (идентификатор иерархии)
- изображения
- текст
- ntext
- XML-
- json
- Любой пользовательский тип
Определения столбцов, включая типы данных и количество столбцов, должны соответствовать данным во внешних файлах. Если есть несоответствие, строки файлов отклоняются при запросе фактических данных.
LOCATION = путь_к_папке_или_файлу
Указывает папку или путь к файлу и имя файла для фактических данных в OneLake в Microsoft Fabric.
ИСТОЧНИК_ДАННЫХ
DATA_SOURCE указывает имя внешнего источника данных, содержащего расположение внешних данных. Чтобы создать внешний источник данных, используйте CREATE EXTERNAL DATA SOURCE.
FILE_FORMAT = external_file_format_name
Указывает имя объекта формата внешнего файла, который хранит тип файла и метод сжатия для внешних данных. Чтобы создать формат внешнего файла, используйте CREATE EXTERNAL FILE FORMAT.
Разрешения
Пользователи, имеющие доступ к внешней таблице, автоматически получают доступ к базовой удаленной таблице с учетными данными, указанными в определении внешнего источника данных. Старайтесь избегать нежелательного повышения прав с использованием учетных данных для внешнего источника данных. Используйте GRANT или REVOKE для внешней таблицы, как если бы это обычная таблица. Определив внешний источник данных и внешние таблицы, вы можете использовать все возможности T-SQL для создания запросов к внешним таблицам.
CREATE EXTERNAL TABLE требуется следующие разрешения пользователя:
CREATE TABLEALTER ANY SCHEMAALTER ANY EXTERNAL DATA SOURCEALTER ANY EXTERNAL FILE FORMAT-
CONTROL DATABASEРазрешения необходимы для создания только главного ключа, учетных данных базы данных и внешнего источника данных.
Имя входа, создающее внешний источник данных, должно иметь разрешение на чтение и запись во внешний источник данных, расположенный в Hadoop или хранилище BLOB-объектов Azure.
Внимание
Разрешение ALTER ANY EXTERNAL DATA SOURCE предоставляет любому субъекту возможность создавать и изменять любой объект внешнего источника данных, поэтому он также предоставляет возможность доступа ко всем учетным данным в области базы данных. Это разрешение следует рассматривать как высоко привилегированное, поэтому его следует предоставлять только доверенным субъектам в системе.
Блокировка
Общая блокировка SCHEMARESOLUTION объекта.
Замечания
В нерегламентированных сценариях запросов, таких как SELECT FROM EXTERNAL TABLEстроки, полученные из внешнего источника данных, хранятся во временной таблице. После завершения запроса строки удаляются, а временная таблица удаляется. В таблицах SQL не сохраняются постоянные данные.
Напротив, в сценарии импорта, например SELECT INTO FROM EXTERNAL TABLE, строки, полученные из внешнего источника данных, хранятся в виде постоянных данных в таблице SQL. Новая таблица создается во время выполнения запроса при извлечении внешних данных.
База данных Fabric SQL поддерживает OneLake только в Microsoft Fabric как источник данных.
Вы можете создать несколько внешних таблиц, которые ссылаются на один или разные внешние источники данных.
Ограничения по ширине таблицы
Ограничение ширины строки в 1 МБ зависит от максимального размера одной допустимой строки по определению таблицы. Если сумма схемы столбца превышает 1 МБ, запросы виртуализации данных завершаются ошибкой.
Обработка ошибок
При выполнении CREATE EXTERNAL TABLE инструкции, если попытка подключения завершается ошибкой, оператор завершается сбоем и внешняя таблица не создается. Это может занять около минуты, поскольку база данных SQL повторяет попытки соединения, прежде чем запрос будет завершен ошибкой.
Ограничения
В настоящее время при создании внешних таблиц, указывающих на CSV-файл в базе данных SQL Fabric, необходимо указать схему таблицы, например: SELECT * FROM [schema].[table_name] В противном случае отображается следующее сообщение об ошибке:
Msg 208, Level 16, State 160, Line 1: Invalid object name 'SQLdatabase-id'
Так как данные для внешней таблицы не контролируются прямым управлением ядром СУБД, его можно изменять или удалять в любое время внешним процессом. По этой причине результаты запроса к внешней таблице необязательно будут детерминированными. Один и то же запрос может возвращать разные результаты при каждом обращении к внешней таблице. Аналогичным образом, запрос может завершиться ошибкой, если внешние данные удалены или перемещены.
Вы можете создать несколько внешних таблиц, которые ссылаются на разные внешние источники данных.
Только эти инструкции DDL допускаются для внешних таблиц:
-
CREATE TABLEиDROP TABLE. -
CREATE STATISTICSиDROP STATISTICS. -
CREATE VIEWиDROP VIEW.
Неподдерживаемые конструкции и операции:
- Ограничение
DEFAULTдля столбцов внешней таблицы. - Удаление, вставка и обновление на языке обработки данных DML.
Примеры
А. Создание внешней таблицы, предназначенной для файла Parquet, доступного в OneLake в Microsoft Fabric
CREATE EXTERNAL DATA SOURCE [MainLakeHouse]
WITH (
LOCATION = 'abfss://<WorkspaceID>@<tenant>.dfs.fabric.microsoft.com/<Lakehouse_id'
);
GO
CREATE EXTERNAL FILE FORMAT [Parquetff]
WITH (
FORMAT_TYPE = PARQUET
);
GO
CREATE EXTERNAL TABLE Customer_parquet
(
CustomerKey INT,
GeoAreaKey INT,
StartDT DATETIME2,
EndDT DATETIME2,
Continent NVARCHAR (50),
Gender NVARCHAR (10),
Title NVARCHAR (10),
GivenName NVARCHAR (100),
MiddleInitial VARCHAR (2),
Surname NVARCHAR (100),
StreetAddress NVARCHAR (200),
City NVARCHAR (100),
State NVARCHAR (100),
StateFull NVARCHAR (100),
ZipCode NVARCHAR (20),
Country_Region NCHAR (2),
CountryFull NVARCHAR (100),
Birthday DATETIME2,
Age INT,
Occupation NVARCHAR (100),
Company NVARCHAR (100),
Vehicle NVARCHAR (100),
Latitude DECIMAL (10, 6),
Longitude DECIMAL (10, 6)
)
WITH (
DATA_SOURCE = MainLakeHouse,
LOCATION = '/Files/parquet/customer.parquet',
FILE_FORMAT = [parquetff]
);
GO
SELECT *
FROM Customer_parquet;