Compartir a través de


Virtualización del archivo parquet en un almacenamiento de objetos compatible con S3 con PolyBase

Se aplica a: SQL Server 2022 (16.x)

SQL Server 2022 (16.x) puede virtualizar datos de archivos parquet. Este proceso permite que los datos permanezcan en su ubicación original, pero se puedan consultar desde una instancia de SQL Server con comandos T-SQL, como cualquier otra tabla. Esta característica usa conectores de PolyBase y minimiza la necesidad de procesos de extracción, transformación y carga de datos (ETL).

En el ejemplo siguiente, virtualizaremos un archivo parquet almacenado en un almacenamiento de objetos compatible con S3.

Para más información sobre la virtualización de datos, consulte Introducción a la virtualización de datos con PolyBase.

Requisitos previos

Para usar las características de integración del almacenamiento de objetos compatible con S3, necesitará los siguientes recursos y herramientas:

  • Instale la característica PolyBase para SQL Server.
  • Instale SQL Server Management Studio (SSMS) o Azure Data Studio.
  • Almacenamiento compatible con S3.
  • Se ha creado un cubo de S3. Los cubos no se pueden crear ni configurar desde SQL Server.
  • Un usuario (Access Key ID) y el secreto (Secret Key ID) y ese usuario es conocido por ti. Necesitará ambos para autenticarse en el punto de conexión de almacenamiento de objetos S3.
  • Permiso ListBucket en el usuario de S3.
  • Permiso ReadOnly en el usuario de S3.
  • TLS debe haberse configurado. Se presupone que todas las conexiones se transmitirán de forma segura a través de HTTPS, no de HTTP. Un certificado instalado en el host del sistema operativo de SQL Server validará el punto de conexión.

Permiso

Para que el usuario de proxy lea el contenido de un cubo de S3, deberá permitirse que el usuario realice las siguientes acciones en el punto de conexión de S3:

  • ListBucket;
  • ReadOnly;

Configuración previa

  1. Habilitar PolyBase en sp_configure:
exec sp_configure @configname = 'polybase enabled', @configvalue = 1
;
RECONFIGURE
;
exec sp_configure @configname = 'polybase enabled'
;
  1. Para poder crear una credencial con ámbito de base de datos, la base de datos debe tener una clave maestra para proteger la credencial. Para obtener más información, vea CREATE MASTER KEY.

Creación de una credencial de ámbito de base de datos

El siguiente script de ejemplo crea una credencial de ámbito de base de datos s3-dc en la base de datos de usuario de origen de SQL Server. Para obtener más información, 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

Compruebe la nueva credencial de ámbito de base de datos con sys.database_scoped_credentials (Transact-SQL):

SELECT * FROM sys.database_scoped_credentials;

Crear un origen de datos externo

El siguiente script de ejemplo crea un origen de datos externo s3_ds en la base de datos de usuario de origen de SQL Server. El origen de datos externo hace referencia a la credencial de ámbito de base de datos s3_dc. Para más información, vea CREATE EXTERNAL DATA SOURCE.

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

Compruebe el nuevo origen de datos externo con sys.external_data_sources.

SELECT * FROM sys.external_data_sources;

Direcciones URL hospedadas virtuales

Algunos sistemas de almacenamiento compatibles con S3 (como Amazon Web Services) usan virtual_hosted direcciones URL de estilo para implementar la estructura de carpetas en el cubo S3. Agrega el siguiente CONNECTION_OPTIONS para permitir la creación de tablas externas que apunten a ubicaciones de carpetas en el cubo S3, por ejemplo CONNECTION_OPTIONS = '{"s3":{"url_style":"virtual_hosted"}}'.

Sin esa configuración CONNECTION_OPTIONS, al consultar tablas externas que apuntan a una carpeta, es posible que observes el siguiente error:

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

SELECT de un archivo parquet mediante OPENROWSET

En el ejemplo siguiente se muestra el uso de T-SQL para consultar un archivo parquet almacenado en el almacenamiento de objetos compatible con S3 mediante la consulta OPENROWSET. Para obtener más información, vea OPENROWSET (Transact-SQL).

Como se trata de un archivo parquet, ocurren dos cosas importantes automáticamente:

  1. SQL Server lee el esquema del propio archivo, por lo que no es necesario definir la tabla, las columnas ni los tipos de datos.
  2. No es necesario declarar el tipo de compresión para que se lea el archivo.
SELECT  * 
FROM    OPENROWSET
        (   BULK '/<bucket>/<parquet_folder>'
        ,   FORMAT       = 'PARQUET'
        ,   DATA_SOURCE  = 's3_ds'
        ) AS [cc];

Consulta del almacenamiento de objetos compatible con S3 a través de una tabla externa

En el ejemplo siguiente se muestra el uso de T-SQL para consultar un archivo PARQUET almacenado en el almacenamiento de objetos compatible con S3 mediante la consulta de tabla externa. En el ejemplo se usa una ruta de acceso relativa dentro del origen de datos externo.

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 más información, vea:

Limitaciones

  1. Las consultas de SQL Server en una tabla externa respaldada por el almacenamiento compatible con S3 se limitan a 1000 objetos por prefijo. Esto se debe a que la lista de objetos compatibles con S3 se limita a 1000 claves de objeto por prefijo.
  2. En el caso del almacenamiento de objetos compatible con S3, los clientes no pueden crear su id. de clave de acceso con un carácter : en él.
  3. La longitud total de la dirección URL no puede superar los 259 caracteres. Esto significa que s3://<hostname>/<objectkey> no debe superar los 259 caracteres. s3:// cuenta para este límite, por lo que la ruta de acceso no puede tener una longitud superior a 259-5 = 254 caracteres.
  4. El nombre de la credencial de SQL está limitado a 128 caracteres en formato UTF-16.
  5. El nombre de la credencial creado debe contener el nombre del cubo a menos que esta credencial sea para un nuevo origen de datos externo.
  6. El identificador de clave de acceso y el identificador de clave secreta solo pueden contener valores alfanuméricos.

Pasos siguientes