Поделиться через


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

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

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

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

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

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

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

  • Установите компонент PolyBase для SQL Server.
  • Установите SQL Server Management Studio (SSMS).
  • совместимое с 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), используют URL-адреса стиля virtual_hosted, чтобы реализовать структуру папок в бакете 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. Идентификатор ключа доступа и идентификатор секретного ключа должны содержать только буквы и цифры.

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