Virtualizar o arquivo Parquet em um armazenamento de objetos compatível com o S3 usando o PolyBase

Aplica-se a: SQL Server 2022 (16.x)

O SQL Server 2022 (16.x) pode virtualizar dados de arquivos parquet. Esse processo permite que os dados permaneçam em seu local original, mas possam ser consultados de uma instância do SQL Server com comandos do T-SQL, como qualquer outra tabela. Esse recurso usa conectores do PolyBase e minimiza a necessidade de processos de ETL.

No exemplo abaixo, virtualizaremos um arquivo Parquet que está no armazenamento de objetos compatível com o S3.

Para saber mais sobre virtualização de dados, confira Introdução à virtualização de dados com o PolyBase.

Pré-requisitos

Para usar os recursos de integração do armazenamento de objetos compatível com o S3, você precisará das seguintes ferramentas e recursos:

  • Instalar o recurso PolyBase para SQL Server.
  • Instalar o SSMS (SQL Server Management Studio) ou o Azure Data Studio.
  • Armazenamento compatível com o S3.
  • Um bucket do S3 criado. Os buckets não podem ser criados nem configurados por meio do SQL Server.
  • Um usuário (Access Key ID) foi configurado e o segredo (Secret Key ID), bem como esse usuário, são conhecidos por você. Você precisará de ambos para se autenticar no ponto de extremidade do armazenamento de objetos do S3.
  • Permissão ListBucket no usuário do S3.
  • Permissão ReadOnly no usuário do S3.
  • O TLS precisa estar configurado. Supõe-se que todas as conexões serão transmitidas com segurança por HTTPS, e não por HTTP. O ponto de extremidade será validado por um certificado instalado no host do sistema operacional do SQL Server.

Permissão

Para que o usuário proxy leia o conteúdo de um bucket do S3, o usuário precisará ter permissão para executar as seguintes ações no ponto de extremidade do S3:

  • ListBucket;
  • ReadOnly;

Pré-configuração

  1. Habilitar o PolyBase em sp_configure:
exec sp_configure @configname = 'polybase enabled', @configvalue = 1
;
RECONFIGURE
;
exec sp_configure @configname = 'polybase enabled'
;
  1. Antes de criar uma credencial no escopo do banco de dados, o banco de dados de usuário precisa ter uma chave mestra para proteger a credencial. Para obter mais informações, confira CREATE MASTER KEY.

Criar uma credencial com escopo de banco de dados

O script de exemplo a seguir cria uma credencial s3-dc no escopo do banco de dados de usuário de origem no SQL Server. Para obter mais informações, veja 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

Verifique a nova credencial no escopo do banco de dados com sys.database_scoped_credentials (Transact-SQL):

SELECT * FROM sys.database_scoped_credentials;

Criar uma fonte de dados externos

O script de exemplo a seguir cria uma fonte de dados externa s3_ds no banco de dados do usuário de origem no SQL Server. A fonte de dados externa faz referência à credencial no escopo do banco de dados s3_dc. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE.

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

Verifique a nova fonte de dados externa com sys.external_data_sources.

SELECT * FROM sys.external_data_sources;

SELECT de um arquivo Parquet usando OPENROWSET

O exemplo a seguir demonstra o uso do T-SQL para consultar um arquivo parquet armazenado no armazenamento de objetos compatível com S3 por meio da consulta OPENROWSET. Para obter mais informações, confira OPENROWSET (Transact-SQL).

Como este é um arquivo Parquet, duas coisas importantes estão acontecendo automaticamente:

  1. O SQL Server lerá o esquema no próprio arquivo, portanto, não é necessário definir a tabela, as colunas ou os tipos de dados.
  2. Não é necessário declarar o tipo de compactação para que o arquivo seja lido.
SELECT  * 
FROM    OPENROWSET
        (   BULK '/<bucket>/<parquet_folder>'
        ,   FORMAT       = 'PARQUET'
        ,   DATA_SOURCE  = 's3_ds'
        ) AS [cc];

Consultar o armazenamento de objetos em conformidade com S3 por meio de tabela externa

O exemplo a seguir demonstra o uso de T-SQL para consultar um arquivo Parquet armazenado no armazenamento de objetos em conformidade com o S3 por meio da consulta de tabela externa. O exemplo usa um caminho relativo dentro da fonte de dados externa.

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];

Para saber mais, veja:

Limitações

  1. As consultas do SQL Server em uma tabela externa com suporte de armazenamento compatível com S3 são limitadas a 1.000 objetos por prefixo. Isso ocorre porque a listagem de objetos compatíveis com S3 é limitada a 1.000 chaves de objeto por prefixo.
  2. Para armazenamento de objetos compatível com o S3, os clientes não têm permissão para criar a ID da chave de acesso contendo um caractere :.
  3. O comprimento total da URL é limitado a 259 caracteres. Isso significa que s3://<hostname>/<objectkey> não deve exceder 259 caracteres. O s3:// conta para esse limite, portanto, o tamanho do caminho não pode exceder 259-5 = 254 caracteres.
  4. O nome da credencial do SQL é limitado a 128 caracteres no formato UTF-16.
  5. O nome da credencial criado precisa conter o nome do bucket, a menos que essa credencial seja para uma nova fonte de dados externa.
  6. A ID da chave de acesso e a ID da chave de secreta precisam conter apenas valores alfanuméricos.

Próximas etapas