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

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

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

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

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

Предварительные условия

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

  • установленный компонент PolyBase для SQL Server;
  • установленный SQL Server Management Studio (SSMS) или Azure Data Studio;
  • совместимое с S3 хранилище;
  • созданный контейнер S3. В SQL Server нельзя создавать и настраивать контейнеры.
  • Пользователь (Access Key ID) настроен, а секрет (Secret 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;

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. Идентификатор ключа доступа и идентификатор секретного ключа должны содержать только буквы и цифры.

Далее