Partilhar via


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 (extração, transformação e carregamento).

No exemplo seguinte, 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ê precisa 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) 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, ele precisa 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;

URLs hospedadas virtuais

Alguns sistemas de armazenamento compatíveis com o S3 (como o Amazon Web Services) utilizam URLs de 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 apontando para locais de pastas no bucket do 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 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 lê 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