Compartir a través de


extensión pg_azure_storage

SE APLICA A: Azure Cosmos DB for PostgreSQL (con tecnología de la extensión de base de datos de Citus en PostgreSQL)

La extensión pg_azure_storage permite cargar datos en varios formatos de archivo directamente desde Azure Blob Storage al clúster de Azure Cosmos DB for PostgreSQL. Al habilitar la extensión también se desbloquean nuevas funcionalidades del comando COPY. Los contenedores con el nivel de acceso "Privado" o "Blob" requieren agregar una clave de acceso privada.

Puede crear la extensión ejecutando:

SELECT create_extension('azure_storage');

azure_storage.account_add

La función permite agregar acceso a una cuenta de almacenamiento.

azure_storage.account_add
        (account_name_p text
        ,account_key_p text);

Argumentos

account_name_p

Una cuenta de Azure Blob Storage (ABS) contiene todos los objetos ABS: blobs, archivos, colas y tablas. La cuenta de almacenamiento proporciona un espacio de nombres único para la instancia de ABS que es accesible desde cualquier lugar del mundo a través de HTTPS.

account_key_p

Las claves de acceso de Azure Blob Storage (ABS) son similares a una contraseña raíz de la cuenta de almacenamiento. Siempre debe proteger las claves de acceso. Use Azure Key Vault para administrar y rotar las claves de forma segura. La clave de cuenta se almacena en una tabla a la que puede acceder el superusuario postgres, azure_storage_admin y todos los roles concedidos a esos permisos de administrador. Para ver qué cuentas de almacenamiento existen, use la función account_list.

azure_storage.account_remove

La función permite revocar el acceso de la cuenta a la cuenta de almacenamiento.

azure_storage.account_remove
        (account_name_p text);

Argumentos

account_name_p

La cuenta de Azure Blob Storage (ABS) contiene todos los objetos ABS: blobs, archivos, colas y tablas. La cuenta de almacenamiento proporciona un espacio de nombres único para la instancia de ABS que es accesible desde cualquier lugar del mundo a través de HTTPS.

azure_storage.account_user_add

La función permite agregar acceso a un rol en una cuenta de almacenamiento.

azure_storage.account_user_add
        ( account_name_p text
        , user_p regrole);

Argumentos

account_name_p

Una cuenta de Azure Blob Storage (ABS) contiene todos los objetos ABS: blobs, archivos, colas y tablas. La cuenta de almacenamiento proporciona un espacio de nombres único para la instancia de ABS que es accesible desde cualquier lugar del mundo a través de HTTPS.

user_p

Rol creado por el usuario visible en el clúster.

Nota:

Las funciones account_user_add,account_add,account_remove,account_user_remove requieren la configuración de permisos para cada nodo individual del clúster.

azure_storage.account_user_remove

La función permite quitar el acceso de un rol a una cuenta de almacenamiento.

azure_storage.account_user_remove
        (account_name_p text
        ,user_p regrole);

Argumentos

account_name_p

Una cuenta de Azure Blob Storage (ABS) contiene todos los objetos ABS: blobs, archivos, colas y tablas. La cuenta de almacenamiento proporciona un espacio de nombres único para la instancia de ABS que es accesible desde cualquier lugar del mundo a través de HTTPS.

user_p

Rol creado por el usuario visible en el clúster.

azure_storage.account_list

La función enumera la cuenta y el rol que tienen acceso a Azure Blob Storage.

azure_storage.account_list
        (OUT account_name text
        ,OUT allowed_users regrole[]
        )
Returns TABLE;

Argumentos

account_name

La cuenta de Azure Blob Storage (ABS) contiene todos los objetos ABS: blobs, archivos, colas y tablas. La cuenta de almacenamiento proporciona un espacio de nombres único para la instancia de ABS que es accesible desde cualquier lugar del mundo a través de HTTPS.

allowed_users

Enumera los usuarios que tienen acceso a Azure Blob Storage.

Tipo de valor devuelto

TABLE

azure_storage.blob_list

La función enumera los archivos de blob disponibles dentro de un contenedor de usuarios con sus propiedades.

azure_storage.blob_list
        (account_name text
        ,container_name text
        ,prefix text DEFAULT ''::text
        ,OUT path text
        ,OUT bytes bigint
        ,OUT last_modified timestamp with time zone
        ,OUT etag text
        ,OUT content_type text
        ,OUT content_encoding text
        ,OUT content_hash text
        )
Returns SETOF record;

Argumentos

account_name

La storage account name proporciona un espacio de nombres único para los datos de Azure Storage que es accesible desde cualquier lugar del mundo mediante HTTPS.

container_name

Un contenedor organiza un conjunto de blobs, de forma parecida a un directorio en un sistema de archivos. Una cuenta de almacenamiento puede contener un número ilimitado de contenedores y un contenedor puede almacenar un número ilimitado de blobs. Un nombre de contenedor debe ser un nombre DNS válido, ya que forma parte del URI único que se usa para direccionar el contenedor o sus blobs. Siga estas reglas al asignar un nombre a un contenedor:

  • Los nombres de contenedor pueden tener entre 3 y 63 caracteres.
  • Los nombres de contenedor deben comenzar por una letra o un número, y solo pueden contener letras en minúscula, números y el carácter de guión (-).
  • En los nombres de contenedor no se permiten dos o más guiones consecutivos.

El identificador URI de un contenedor es similar a: https://myaccount.blob.core.windows.net/mycontainer

prefix

Devuelve el archivo del contenedor de blobs con iniciales de cadena coincidentes.

path

Ruta de acceso completa del directorio de blobs de Azure.

bytes

Tamaño del objeto de archivo en bytes.

last_modified

Cuándo se modificó por última vez el contenido del archivo.

ETag

Una propiedad ETag se usa para la simultaneidad optimista durante las actualizaciones. No es una marca de tiempo, ya que hay otra propiedad denominada Marca de tiempo que almacena la última vez que se actualizó un registro. Por ejemplo, si carga una entidad y quiere actualizarla, la etiqueta ETag debe coincidir con lo que está almacenado actualmente. Establecer la etiqueta ETag adecuada es importante porque, si tiene varios usuarios editando el mismo elemento, no querrá que sobrescriban los cambios entre sí.

content_type

El objeto Blob representa un blob, que es un objeto similar a un archivo de datos inmutables y sin procesar. Se pueden leer como datos binarios o de texto, o convertirse en ReadableStream para que sus métodos se puedan usar para procesar los datos. Los blobs pueden representar datos que no tienen necesariamente un formato nativo de JavaScript.

content_encoding

Azure Storage permite definir la propiedad Content-Encoding en un blob. En el caso del contenido comprimido, puede establecer la propiedad en GZIP. Cuando el explorador accede al contenido, descomprime automáticamente el contenido.

content_hash

Este hash se utiliza para comprobar la integridad del blob durante el transporte. Cuando se especifica este encabezado, el servicio de almacenamiento compara el hash que ha llegado con el que se envió. Si ambos valores de hash no coinciden, la operación produce un error con el código de estado 400 (solicitud incorrecta).

Tipo de valor devuelto

Registro SETOF

Nota:

Permisos Ahora puede enumerar los contenedores establecidos en los niveles de acceso Privado y Blob para ese almacenamiento, pero solo como el usuario citus user, que tiene el rol azure_storage_admin concedido a él. Si crea un nuevo usuario denominado support, no podrá acceder al contenido del contenedor de forma predeterminada.

azure_storage.blob_get

La función permite cargar el contenido del archivo o archivos desde dentro del contenedor, con compatibilidad agregada sobre el filtrado o la manipulación de datos, antes de la importación.

azure_storage.blob_get
        (account_name text
        ,container_name text
        ,path text
        ,decoder text DEFAULT 'auto'::text
        ,compression text DEFAULT 'auto'::text
        ,options jsonb DEFAULT NULL::jsonb
        )
RETURNS SETOF record;

Hay una versión sobrecargada de la función, que contiene el parámetro rec que permite definir convenientemente el registro de formato de salida.

azure_storage.blob_get
        (account_name text
        ,container_name text
        ,path text
        ,rec anyelement
        ,decoder text DEFAULT 'auto'::text
        ,compression text DEFAULT 'auto'::text
        ,options jsonb DEFAULT NULL::jsonb
        )
RETURNS SETOF anyelement;

Argumentos

account

La cuenta de almacenamiento proporciona un espacio de nombres único para los datos de Azure Storage que es accesible desde cualquier lugar del mundo mediante HTTPS.

contenedor

Un contenedor organiza un conjunto de blobs, de forma parecida a un directorio en un sistema de archivos. Una cuenta de almacenamiento puede contener un número ilimitado de contenedores y un contenedor puede almacenar un número ilimitado de blobs. Un nombre de contenedor debe ser un nombre DNS válido, ya que forma parte del URI único que se usa para direccionar el contenedor o sus blobs.

path

Nombre del blob existente en el contenedor.

rec

Defina la estructura de salida del registro.

decodificador

Especifique que el descodificador de formato de blobs se puede establecer en automático (valor predeterminado) o en cualquiera de los valores siguientes

descripción del descodificador

Formato Descripción
csv Formato de valores separados por comas usado por COPY de PostgreSQL
tsv Valores separados por tabulaciones, el formato COPY predeterminado de PostgreSQL
binary Formato COPY de PostgreSQL binario
text Un archivo que contiene un único valor de texto (por ejemplo, JSON grande o XML)

compression

Define el formato de compresión. Las opciones disponibles son auto, gzip y none. El uso de la opción auto (valor predeterminado) adivina la compresión en función de la extensión de archivo (.gz == gzip). La opción none obliga a omitir la extensión y no a intentar descodificar. Mientras que gzip fuerza el uso del descodificador gzip (para cuando tenga un archivo comprimido en gzip con una extensión no estándar). Actualmente, no se admiten otros formatos de compresión para la extensión.

opciones

Para controlar encabezados personalizados, separadores personalizados, caracteres de escape, etc., options funciona de forma similar al comando COPY en PostgreSQL, el parámetro utiliza la función blob_get.

Tipo de valor devuelto

SETOF Record / anyelement

Nota:

Hay cuatro funciones de utilidad, que se llaman como parámetros, dentro de blob_get que ayudan a crear valores para ella. Cada función de utilidad se designa para el decodificador que coincide con su nombre.

azure_storage.options_csv_get

La función actúa como una función de utilidad a la que se llama como un parámetro dentro de blob_get, lo que resulta útil para descodificar el contenido csv.

azure_storage.options_csv_get
        (delimiter text DEFAULT NULL::text
        ,null_string text DEFAULT NULL::text
        ,header boolean DEFAULT NULL::boolean
        ,quote text DEFAULT NULL::text
        ,escape text DEFAULT NULL::text
        ,force_not_null text[] DEFAULT NULL::text[]
        ,force_null text[] DEFAULT NULL::text[]
        ,content_encoding text DEFAULT NULL::text
        )
Returns jsonb;

Argumentos

delimiter

Especifica el carácter que separa las columnas de cada fila (línea) del archivo. El valor predeterminado es un carácter de tabulación en formato de texto, una coma en formato CSV. Debe ser un carácter de un solo byte.

null_string

Especifica la cadena que representa un valor nulo. El valor predeterminado es \N (barra diagonal inversa-N) en formato de texto y una cadena vacía sin comillas en formato CSV. Es posible que prefiera una cadena vacía incluso en formato de texto para los casos en los que no desea distinguir valores nulos de cadenas vacías.

Especifica que el archivo contiene una línea de encabezado con los nombres de cada columna del archivo. En la salida, la primera línea contiene los nombres de columna de la tabla.

comillas

Especifica el carácter de comillas que se va a usar cuando un valor de datos se pone entre comillas. El valor predeterminado es comillas dobles. Debe ser un carácter de un solo byte.

escape

Especifica el carácter que debe aparecer antes de un carácter de datos que coincida con el valor QUOTE. El valor predeterminado es el mismo que el valor QUOTE (por lo que el carácter de comillas se duplica si aparece en los datos). Debe ser un carácter de un solo byte.

force_not_null

No coincide con los valores de las columnas especificadas con la cadena nula. En el caso predeterminado en el que la cadena nula esté vacía, esto significa que los valores vacíos se leen como cadenas de longitud cero en lugar de valores nulos, incluso cuando no están entre comillas.

force_null

Coincide con los valores de las columnas especificadas con la cadena nula, incluso si se puesto entre comillas y se encuentra una coincidencia, establezca el valor como un valor nulo. En el caso predeterminado en el que la cadena nula esté vacía, convierte una cadena vacía entre comillas en un valor nulo.

content_encoding

Especifica que el archivo está codificado en el encoding_name. Si se omite la opción, se usa la codificación del cliente actual.

Tipo de valor devuelto

jsonb

azure_storage.options_copy

La función actúa como una función de utilidad a la que se llama como parámetro dentro de blob_get.

azure_storage.options_copy
        (delimiter text DEFAULT NULL::text
        ,null_string text DEFAULT NULL::text
        ,header boolean DEFAULT NULL::boolean
        ,quote text DEFAULT NULL::text
        ,escape text DEFAULT NULL::text
        ,force_quote text[] DEFAULT NULL::text[]
        ,force_not_null text[] DEFAULT NULL::text[]
        ,force_null text[] DEFAULT NULL::text[]
        ,content_encoding text DEFAULT NULL::text
        )
Returns jsonb;

Argumentos

delimiter

Especifica el carácter que separa las columnas de cada fila (línea) del archivo. El valor predeterminado es un carácter de tabulación en formato de texto, una coma en formato CSV. Debe ser un carácter de un solo byte.

null_string

Especifica la cadena que representa un valor nulo. El valor predeterminado es \N (barra diagonal inversa-N) en formato de texto y una cadena vacía sin comillas en formato CSV. Es posible que prefiera una cadena vacía incluso en formato de texto para los casos en los que no desea distinguir valores nulos de cadenas vacías.

header

Especifica que el archivo contiene una línea de encabezado con los nombres de cada columna del archivo. En la salida, la primera línea contiene los nombres de columna de la tabla.

comillas

Especifica el carácter de comillas que se va a usar cuando un valor de datos se pone entre comillas. El valor predeterminado es comillas dobles. Debe ser un carácter de un solo byte.

escape

Especifica el carácter que debe aparecer antes de un carácter de datos que coincida con el valor QUOTE. El valor predeterminado es el mismo que el valor QUOTE (por lo que el carácter de comillas se duplica si aparece en los datos). Debe ser un carácter de un solo byte.

force_quote

Obliga a que se usen comillas para todos los valores que no son nulos en cada columna especificada. La salida nula nunca se pone entre comillas. Si se especifica *, los valores que no son nulos se citan en todas las columnas.

force_not_null

No coincide con los valores de las columnas especificadas con la cadena nula. En el caso predeterminado en el que la cadena nula esté vacía, esto significa que los valores vacíos se leen como cadenas de longitud cero en lugar de valores nulos, incluso cuando no están entre comillas.

force_null

Coincide con los valores de las columnas especificadas con la cadena nula, incluso si se puesto entre comillas y se encuentra una coincidencia, establezca el valor como un valor nulo. En el caso predeterminado en el que la cadena nula esté vacía, convierte una cadena vacía entre comillas en un valor nulo.

content_encoding

Especifica que el archivo está codificado en el encoding_name. Si se omite la opción, se usa la codificación del cliente actual.

Tipo de valor devuelto

jsonb

azure_storage.options_tsv

La función actúa como una función de utilidad a la que se llama como parámetro dentro de blob_get. Resulta útil para descodificar el contenido de tsv.

azure_storage.options_tsv
        (delimiter text DEFAULT NULL::text
        ,null_string text DEFAULT NULL::text
        ,content_encoding text DEFAULT NULL::text
        )
Returns jsonb;

Argumentos

delimiter

Especifica el carácter que separa las columnas de cada fila (línea) del archivo. El valor predeterminado es un carácter de tabulación en formato de texto, una coma en formato CSV. Debe ser un carácter de un solo byte.

null_string

Especifica la cadena que representa un valor nulo. El valor predeterminado es \N (barra diagonal inversa-N) en formato de texto y una cadena vacía sin comillas en formato CSV. Es posible que prefiera una cadena vacía incluso en formato de texto para los casos en los que no desea distinguir valores nulos de cadenas vacías.

content_encoding

Especifica que el archivo está codificado en el encoding_name. Si se omite la opción, se usa la codificación del cliente actual.

Tipo de valor devuelto

jsonb

azure_storage.options_binary

La función actúa como una función de utilidad a la que se llama como parámetro dentro de blob_get. Resulta útil para descodificar el contenido binario.

azure_storage.options_binary
        (content_encoding text DEFAULT NULL::text)
Returns jsonb;

Argumentos

content_encoding

Especifica que el archivo está codificado en el encoding_name. Si se omite esta opción, se usa la codificación del cliente actual.

Tipo de valor devuelto

jsonb

Nota:

Permisos Ahora puede enumerar los contenedores establecidos en los niveles de acceso Privado y Blob para ese almacenamiento, pero solo como el usuario citus user, que tiene el rol azure_storage_admin concedido a él. Si crea un nuevo usuario denominado "support" ("asistencia"), no podrá acceder al contenido del contenedor de forma predeterminada.

Ejemplos

Los ejemplos usados usan una cuenta de almacenamiento de Azure de ejemplo (pgquickstart) con archivos personalizados cargados para agregar a la cobertura de diferentes casos de uso. Podemos empezar creando una tabla que se usa en el conjunto de ejemplo utilizado.

CREATE TABLE IF NOT EXISTS public.events
        (
         event_id bigint
        ,event_type text
        ,event_public boolean
        ,repo_id bigint
        ,payload jsonb
        ,repo jsonb
        ,user_id bigint
        ,org jsonb
        ,created_at timestamp without time zone
        );

Adición de la clave de acceso de la cuenta de almacenamiento (obligatoria para el nivel de acceso = privado)

En el ejemplo, se muestra cómo agregar la clave de acceso para la cuenta de almacenamiento para obtener acceso con el fin de realizar consultas desde una sesión en el clúster de Azure Cosmos DB for Postgres.

SELECT azure_storage.account_add('pgquickstart', 'SECRET_ACCESS_KEY');

Sugerencia

En la cuenta de almacenamiento, abra Claves de acceso. Copie el Nombre de la cuenta de almacenamiento y copie la sección Clave de key1 (primero debe seleccionar Mostrar junto a la clave).

Screenshot of Security + networking > Access keys section of an Azure Blob Storage page in the Azure portal.

Eliminación de la clave de acceso de la cuenta de almacenamiento

En el ejemplo, se muestra cómo quitar la clave de acceso de una cuenta de almacenamiento. Esta acción daría lugar a la eliminación del acceso a los archivos hospedados en un cubo privado en el contenedor.

SELECT azure_storage.account_remove('pgquickstart');

Adición de acceso para un rol a Azure Blob Storage

SELECT * FROM azure_storage.account_user_add('pgquickstart', 'support');

Enumeración de todos los roles con acceso en Azure Blob Storage

SELECT * FROM azure_storage.account_list();

Eliminación de los roles con acceso en Azure Blob Storage

SELECT * FROM azure_storage.account_user_remove('pgquickstart', 'support');

Enumeración de los objetos dentro de un contenedor public

SELECT * FROM azure_storage.blob_list('pgquickstart','publiccontainer');

Enumeración de los objetos dentro de un contenedor private

SELECT * FROM azure_storage.blob_list('pgquickstart','privatecontainer');

Nota:

La adición de la clave de acceso es obligatoria.

Enumeración de los objetos con iniciales de cadena específicas dentro del contenedor público

SELECT * FROM azure_storage.blob_list('pgquickstart','publiccontainer','e');

O bien

SELECT * FROM azure_storage.blob_list('pgquickstart','publiccontainer') WHERE path LIKE 'e%';

Lectura del contenido de un objeto en un contenedor

La función blob_get recupera un archivo de Blob Storage. Para que blob_get sepa cómo analizar los datos, puede pasar un valor (NULL::table_name), que tiene el mismo formato que el archivo.

SELECT * FROM azure_storage.blob_get
        ('pgquickstart'
        ,'publiccontainer'
        ,'events.csv.gz'
        , NULL::events)
LIMIT 5;

Como alternativa, podemos definir explícitamente las columnas de la cláusula FROM.

SELECT * FROM azure_storage.blob_get('pgquickstart','publiccontainer','events.csv')
AS res (
         event_id BIGINT
        ,event_type TEXT
        ,event_public BOOLEAN
        ,repo_id BIGINT
        ,payload JSONB
        ,repo JSONB
        ,user_id BIGINT
        ,org JSONB
        ,created_at TIMESTAMP WITHOUT TIME ZONE)
LIMIT 5;

Uso de la opción de descodificador

El ejemplo muestra el uso de la opción decoder. Por lo general, el formato se deduce de la extensión del archivo, pero, cuando el contenido del archivo no tiene una extensión coincidente, puede pasar el argumento de descodificador.

SELECT * FROM azure_storage.blob_get
        ('pgquickstart'
        ,'publiccontainer'
        ,'events'
        , NULL::events
        , decoder := 'csv')
LIMIT 5;

Uso de la compresión con la opción de descodificador

En el ejemplo, se muestra cómo aplicar el uso de la compresión gzip en un archivo comprimido gzip sin una extensión .gz estándar.

SELECT * FROM azure_storage.blob_get
        ('pgquickstart'
        ,'publiccontainer'
        ,'events-compressed'
        , NULL::events
        , decoder := 'csv'
        , compression := 'gzip')
LIMIT 5;

Importar contenido filtrado y modificar antes de cargar desde el objeto de formato csv

En el ejemplo se muestra la posibilidad de filtrar y modificar el contenido que se importa desde el objeto en el contenedor antes de cargarlo en una tabla SQL.

SELECT concat('P-',event_id::text) FROM azure_storage.blob_get
        ('pgquickstart'
        ,'publiccontainer'
        ,'events.csv'
        , NULL::events)
WHERE event_type='PushEvent'
LIMIT 5;

Consulta del contenido del archivo con encabezados, separadores personalizados, caracteres de escape

Puede usar separadores personalizados y caracteres de escape al pasar el resultado de azure_storage.options_copy al argumento options.

SELECT * FROM azure_storage.blob_get
        ('pgquickstart'
        ,'publiccontainer'
        ,'events_pipe.csv'
        ,NULL::events
        ,options := azure_storage.options_csv_get(delimiter := '|' , header := 'true')
        );

Consulta de agregación sobre el contenido de un objeto en el contenedor

De este modo, puede consultar datos sin importarlos.

SELECT event_type,COUNT(1) FROM azure_storage.blob_get
        ('pgquickstart'
        ,'publiccontainer'
        ,'events.csv'
        , NULL::events)
GROUP BY event_type
ORDER BY 2 DESC
LIMIT 5;

Pasos siguientes