Partilhar via


Virtualize o arquivo parquet em um armazenamento de objetos compatível com o S3 com o PolyBase

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

O SQL Server 2022 (16.x) consegue virtualizar dados a partir de ficheiros Parquet. Esse processo permite que os dados permaneçam em seu local original, mas podem ser consultados a partir de uma instância do SQL Server com comandos T-SQL, como qualquer outra tabela. Esse recurso usa conectores PolyBase e minimiza a necessidade de processos de extração, transformação e carregamento (ETL).

No exemplo a seguir, virtualizaremos um arquivo parquet armazenado no armazenamento de objetos compatível com o S3.

Para obter mais informações sobre virtualização de dados, consulte Introdução à virtualização de dados com o PolyBase.

Pré-requisitos

Para usar os recursos de integração de armazenamento de objetos compatíveis com o S3, você precisa das seguintes ferramentas e recursos:

  • Instale o recurso PolyBase para SQL Server.
  • Instale SQL Server Management Studio (SSMS).
  • Armazenamento compatível com S3.
  • Um bucket do S3 foi criado. Os buckets não podem ser criados ou configurados a partir do SQL Server.
  • Um usuário (Access Key ID) e o segredo (Secret Key ID) e esse usuário é conhecido por você. Você precisará de ambos para autenticar no endpoint de armazenamento de objetos do S3.
  • Permissão ListBucket no usuário do S3.
  • Permissão ReadOnly no usuário do S3.
  • O TLS deve ter sido configurado. Presume-se que todas as conexões serão transmitidas com segurança por HTTPS e não HTTP. O ponto de extremidade será validado por um certificado instalado no host do sistema operacional SQL Server.

Permissão

Para que o utilizador proxy leia o conteúdo de um bucket do S3, ele precisa ter permissão para executar as seguintes ações no endpoint do S3:

  • ListBucket;
  • Somente leitura;

Pré-configuração

  1. Habilite 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 com escopo de banco de dados, o banco de dados de usuário deve ter uma chave mestra para proteger a credencial. Para obter mais informações, consulte CREATE MASTER KEY.

Criar uma credencial com escopo de banco de dados

O seguinte script de exemplo cria uma credencial de escopo de banco de dados s3-dc no banco de dados do utilizador de origem no SQL Server. Para obter mais informações, consulte 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 com âmbito de base de dados com sys.database_scoped_credentials (Transact-SQL):

SELECT * FROM sys.database_scoped_credentials;

Criar uma fonte de dados externa

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

URLs hospedadas virtualmente

Alguns sistemas de armazenamento compatíveis com o S3 (como o Amazon Web Services) utilizam URLs no estilo virtual_hosted para implementar a estrutura de pastas no bucket do S3. Adicione o seguinte CONNECTION_OPTIONS para permitir a criação de tabelas externas que apontem para locais de pastas no bucket S3, por exemplo, CONNECTION_OPTIONS = '{"s3":{"url_style":"virtual_hosted"}}'.

Sem essa configuração CONNECTION_OPTIONS, ao consultar tabelas externas apontando para uma pasta, você pode observar o seguinte erro:

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

SELECT a partir de um ficheiro 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 o S3 por meio da consulta OPENROWSET. Para obter mais informações, consulte OPENROWSET (Transact-SQL).

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

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

Consultar o armazenamento de objetos compatíveis com o S3 através de uma tabela externa

O exemplo a seguir demonstra o uso do T-SQL para consultar um arquivo parquet armazenado no armazenamento de objetos compatível 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 obter mais informações, consulte:

Limitações

  1. As consultas do SQL Server em uma tabela externa apoiada por armazenamento compatível com o S3 são limitadas a 1.000 objetos por prefixo. Isso ocorre porque a listagem de objetos compatíveis com o 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 seu ID de chave de acesso com um : caractere.
  3. O comprimento total do URL é limitado a 259 caracteres. Isso significa que s3://<hostname>/<objectkey> não deve exceder 259 caracteres. A s3:// conta para este limite, portanto, o comprimento do caminho não pode exceder 259-5 = 254 caracteres.
  4. O nome da credencial SQL é limitado por 128 caracteres no formato UTF-16.
  5. O nome da credencial criada deve conter o nome do bucket, a menos que essa credencial seja para uma nova fonte de dados externa.
  6. O ID da Chave de Acesso e o ID da Chave Secreta devem conter apenas valores alfanuméricos.

Próximos passos