Виртуализация файла Parquet в совместимом с S3 хранилище объектов с помощью PolyBase

Область применения: SQL Server 2022 (16.x)

SQL Server 2022 (16.x) может виртуализировать данные из файлов parquet. Этот процесс позволяет сохранять данные в исходном расположении, но при этом запрашивать их из экземпляра SQL Server, как любую таблицу. Эта функция использует соединители PolyBase и сокращает потребность в извлечении, преобразовании и загрузке (ETL).

В следующем примере мы виртуализируем файл parquet, хранящийся в хранилище объектов, совместимом с S3.

Дополнительные сведения о виртуализации данных см. в разделе Общие сведения о виртуализации данных с помощью PolyBase.

Необходимые компоненты

Чтобы использовать функции интеграции хранилища объектов, совместимых с S3, вам потребуются следующие средства и ресурсы:

  • установленный компонент PolyBase для SQL Server;
  • установленный SQL Server Management Studio (SSMS) или Azure Data Studio;
  • совместимое с S3 хранилище;
  • созданный контейнер S3. В SQL Server нельзя создавать и настраивать контейнеры.
  • Пользователь () и секрет (Access Key IDSecret Key ID) и этот пользователь известен вам. Они потребуются для проверки подлинности в конечной точке совместимого с S3 хранилища объектов.
  • Разрешение ListBucket для пользователя S3.
  • Разрешение ReadOnly для пользователя S3.
  • Необходимо настроить TLS. Предполагается, что все подключения будут безопасно передаваться по протоколу HTTPS, а не HTTP. Конечная точка будет проверяться с помощью сертификата, установленного на узле ОС SQL Server.

Разрешение

Чтобы прокси-пользователь считывал содержимое контейнера S3, пользователю необходимо разрешить выполнить следующие действия для конечной точки S3:

  • ListBucket;
  • ReadOnly.

Предварительная настройка

  1. Включите PolyBase в sp_configure:
exec sp_configure @configname = 'polybase enabled', @configvalue = 1
;
RECONFIGURE
;
exec sp_configure @configname = 'polybase enabled'
;
  1. Перед созданием учетных данных на уровне базы данных в базе данных должен быть главный ключ для защиты учетных данных. Дополнительные сведения см. в статье CREATE MASTER KEY.

Создание учетных данных на уровне базы данных

Следующий пример скрипта создает учетные данные на уровне базы данных s3-dc в исходной пользовательской базе данных в SQL Server. Дополнительные сведения см. в разделе Инструкция CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).

IF NOT EXISTS(SELECT * FROM sys.credentials WHERE name = 's3_dc')
BEGIN
 CREATE DATABASE SCOPED CREDENTIAL s3_dc
 WITH IDENTITY = 'S3 Access Key',
 SECRET = '<AccessKeyID>:<SecretKeyID>' ;
END

Проверьте новые учетные данные на уровне базы данных с помощью sys.database_scoped_credentials (Transact-SQL):

SELECT * FROM sys.database_scoped_credentials;

создайте внешний источник данных;

Следующий пример скрипта создает внешний источник данных s3_ds в исходной пользовательской базе данных в SQL Server. Внешний источник данных ссылается на учетные данные на уровне базы данных s3_dc. Дополнительные сведения см. в разделе CREATE EXTERNAL DATA SOURCE.

CREATE EXTERNAL DATA SOURCE s3_ds
WITH
(   LOCATION = 's3://<ip_address>:<port>/'
,   CREDENTIAL = s3_dc
);
GO

Проверьте новый внешний источник данных с помощью sys.external_data_sources.

SELECT * FROM sys.external_data_sources;

Виртуальные РАЗМЕЩЕННЫе URL-адреса

Некоторые системы хранения, совместимые с S3 (например, Amazon Web Services), используют virtual_hosted URL-адреса стилей для реализации структуры папок в контейнере S3. Добавьте следующее CONNECTION_OPTIONS , чтобы разрешить создание внешних таблиц, указывающих на расположения папок в контейнере S3, например CONNECTION_OPTIONS = '{"s3":{"url_style":"virtual_hosted"}}'.

Без этого CONNECTION_OPTIONS параметра при запросе внешних таблиц, указывающих на папку, может возникнуть следующая ошибка:

Msg 13807, Level 16, State 1, Line 23  
Content of directory on path '/<folder_name>/' cannot be listed. 

SELECT из файла Parquet с помощью OPENROWSET

В следующем примере показано использование T-SQL для запроса файла parquet, хранящегося в хранилище объектов, совместимом с S3, с помощью запроса OPENROWSET. Дополнительные сведения см. в разделе OPENROWSET (Transact-SQL).

Так как это файл Parquet, автоматически выполняются две важные вещи.

  1. SQL Server считывает схему из самого файла, поэтому не нужно определять таблицу, столбцы или типы данных.
  2. Нет необходимости объявлять тип сжатия для считываемого файла.
SELECT  * 
FROM    OPENROWSET
        (   BULK '/<bucket>/<parquet_folder>'
        ,   FORMAT       = 'PARQUET'
        ,   DATA_SOURCE  = 's3_ds'
        ) AS [cc];

Запрос хранилища объектов, совместимых с S3, через внешнюю таблицу

В следующем примере показано использование T-SQL для запроса файла parquet, хранящегося в хранилище объектов, совместимом с S3, с помощью запроса внешней таблицы. В примере используется относительный путь в внешнем источнике данных.

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);
GO

SELECT * FROM [Region];

Дополнительные сведения см. в разделе:

Ограничения

  1. Запросы SQL Server во внешней таблице, поддерживаемой хранилищем, совместимом с S3, ограничены 1000 объектами на префикс. Это связано с тем, что список объектов, совместимый с S3, ограничен 1000 ключами объектов на префикс.
  2. Для хранилища объектов, совместимого с S3, клиенты не могут создавать идентификатор ключа доступа с символом : в нем.
  3. Длина URL-адреса ограничена 259 символами. Это означает, что количество символов для s3://<hostname>/<objectkey> не должно превышать 259. Количество s3:// входит в это ограничение, поэтому длина пути не может превышать 259 – 5 = 254 символа.
  4. Имя учетных данных SQL ограничено 128 символами в формате UTF-16.
  5. Созданное имя учетных данных должно содержать имя контейнера, если только эти учетные данные не предназначены для нового внешнего источника данных.
  6. Идентификатор ключа доступа и идентификатор секретного ключа должны содержать только буквы и цифры.

Следующие шаги