Exportar datos a Spanner (ETL inverso)

En este documento se describe cómo configurar un flujo de trabajo de extracción, transformación y carga inversas (ETL inversas) de BigQuery a Spanner. Para ello, puedes usar la instrucción EXPORT DATA para exportar datos de una tabla de BigQuery a una tabla de Spanner.

Este flujo de trabajo de ETL inverso combina las funciones analíticas de BigQuery con la baja latencia y el alto rendimiento de Spanner. Este flujo de trabajo le permite ofrecer datos a los usuarios de la aplicación sin agotar las cuotas ni los límites de BigQuery.

Antes de empezar

Roles obligatorios

Para obtener los permisos que necesitas para exportar datos de BigQuery a Spanner, pide a tu administrador que te asigne los siguientes roles de gestión de identidades y accesos en tu proyecto:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Limitaciones

  • Esta función no está disponible en Assured Workloads.

  • Los siguientes tipos de datos de BigQuery no tienen equivalentes en Spanner y no se admiten:

Dialecto de la base de datos de Spanner Tipos de BigQuery no admitidos
Todos los dialectos
  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME
GoogleSQL
  • BIGNUMERIC: el tipo NUMERIC admitido no tiene la anchura suficiente. Añade conversiones explícitas al tipo NUMERIC en la consulta.
  • El tamaño máximo de una fila exportada no puede superar 1 MiB.

  • Spanner aplica la integridad referencial durante la exportación. Si la tabla de destino es una tabla secundaria de otra tabla (INTERLEAVE IN PARENT) o si tiene restricciones de clave externa, las claves externas y la clave superior se validarán durante la exportación. Si una fila exportada se escribe en una tabla con INTERLEAVE IN PARENT y la fila principal no existe, la exportación fallará y se mostrará el mensaje "Parent row is missing " (Falta la fila principal). No se puede escribir en la fila". Si la fila exportada se escribe en una tabla con restricciones de clave externa y hace referencia a una clave que no existe, la exportación fallará y se mostrará el error "Se ha infringido la restricción de clave externa". Cuando exporte datos a varias tablas, le recomendamos que secuencie la exportación para asegurarse de que se mantenga la integridad referencial durante el proceso. Por lo general, esto significa que debe exportar las tablas principales y las tablas a las que hacen referencia las claves externas antes que las tablas que hacen referencia a ellas.

    Si la tabla de destino de la exportación tiene restricciones de clave externa o es una tabla secundaria de otra tabla (INTERLEAVE IN PARENT), la tabla superior debe rellenarse antes de exportar la tabla secundaria y debe contener todas las claves correspondientes. Si intentas exportar una tabla secundaria mientras una tabla principal no tiene el conjunto completo de claves relevantes, se producirá un error.

  • Las tareas de exportación a Spanner tienen una duración máxima de 6 horas. Para obtener información sobre cómo optimizar los trabajos de exportación de gran tamaño, consulta el artículo Optimización de exportaciones. También puedes dividir la entrada en bloques de datos individuales, que se pueden exportar como tareas de exportación individuales.

  • Las exportaciones a Spanner solo se admiten en las ediciones BigQuery Enterprise o Enterprise Plus. No se admiten la edición estándar de BigQuery ni el cálculo bajo demanda.

  • Se admiten exportaciones a esquemas de Spanner predeterminados. No se admiten tablas de esquemas con nombre.

  • No puedes usar consultas continuas para exportar datos a tablas de Spanner con claves primarias generadas automáticamente.

  • No puedes usar consultas continuas para exportar datos a tablas de Spanner en una base de datos con dialecto PostgreSQL.

  • Cuando uses consultas continuas para exportar datos a una tabla de Spanner, asegúrate de elegir una clave principal que no corresponda a un número entero que aumente de forma monótona en tu tabla de BigQuery. Si lo hace, puede que se produzcan problemas de rendimiento en la exportación. Para obtener información sobre las claves principales en Spanner y sobre cómo mitigar estos problemas de rendimiento, consulta Elegir una clave principal.

Configurar exportaciones con la opción spanner_options

Puede usar la opción spanner_options para especificar una base de datos y una tabla de Spanner de destino. La configuración se expresa en forma de cadena JSON, como se muestra en el siguiente ejemplo:

EXPORT DATA OPTIONS(
   uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
  format='CLOUD_SPANNER',
   spanner_options = """{
      "table": "TABLE_NAME",
      "change_timestamp_column": "CHANGE_TIMESTAMP",
      "priority": "PRIORITY",
      "tag": "TAG",
   }"""
)

Haz los cambios siguientes:

  • PROJECT_ID: el nombre de tu Google Cloud proyecto.
  • INSTANCE_ID: el nombre de tu instancia de base de datos.
  • DATABASE_ID: el nombre de tu base de datos.
  • TABLE_NAME: el nombre de una tabla de destino ya creada.
  • CHANGE_TIMESTAMP: el nombre de una columna de tipo TIMESTAMP de una tabla de Spanner para registrar la marca de tiempo de la actualización más reciente de la fila correspondiente de una tabla de BigQuery que se está exportando. Este campo es opcional para las exportaciones por lotes y continuas a Spanner, pero se recomienda para los casos prácticos en los que es importante el orden de las filas exportadas con la misma clave principal.
  • PRIORITY (opcional): prioridad de las solicitudes de escritura. Valores permitidos: LOW, MEDIUM y HIGH. Valor predeterminado: MEDIUM.
  • TAG (opcional): etiqueta de solicitud para identificar el tráfico del exportador en la monitorización de Spanner. Valor predeterminado: bq_export.

Requisitos de las consultas de exportación

Para exportar los resultados de una consulta a Spanner, estos deben cumplir los siguientes requisitos:

  • Todas las columnas del conjunto de resultados deben existir en la tabla de destino y sus tipos deben coincidir o ser convertibles.
  • El conjunto de resultados debe contener todas las columnas NOT NULL de la tabla de destino.
  • Los valores de las columnas no deben superar los límites de tamaño de los datos de Spanner en las tablas.
  • Los tipos de columna no admitidos deben convertirse a uno de los tipos admitidos antes de exportarlos a Spanner.

Conversiones de tipos

Para que sea más fácil de usar, el exportador de Spanner aplica automáticamente las siguientes conversiones de tipo:

Tipo de BigQuery Tipo de Spanner
BIGNUMERIC NUMERIC (solo dialecto de PostgreSQL)
FLOAT64 FLOAT32
BYTES PROTO
INT64 ENUM

Exportar datos

Puedes usar la instrucción EXPORT DATA para exportar datos de una tabla de BigQuery a una tabla de Spanner.

En el siguiente ejemplo se exportan los campos seleccionados de una tabla llamada mydataset.table1:

EXPORT DATA OPTIONS (
  uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
  format='CLOUD_SPANNER',
  spanner_options="""{ "table": "TABLE_NAME" }"""
)
AS SELECT * FROM mydataset.table1;

Haz los cambios siguientes:

  • PROJECT_ID: el nombre de tu Google Cloud proyecto
  • INSTANCE_ID: el nombre de tu instancia de base de datos
  • DATABASE_ID: el nombre de tu base de datos
  • TABLE_NAME: el nombre de una tabla de destino ya creada

Exportar varios resultados con el mismo valor de rowkey

Cuando exportas un resultado que contiene varias filas con el mismo valor de rowkey, los valores escritos en Spanner terminan en la misma fila de Spanner. En el conjunto de filas de Spanner generado por la exportación solo se incluirá una fila de BigQuery coincidente (no se garantiza cuál).

Exportar de forma continua

Para procesar una consulta de exportación de forma continua, puedes configurarla como consulta continua.

Optimización de exportación

Para optimizar la exportación de registros de BigQuery a Spanner, puede probar lo siguiente:

  • Aumentar el número de nodos en la instancia de destino de Spanner. Ten en cuenta que, durante las primeras fases de la exportación, aumentar el número de nodos de la instancia puede que no provoque un aumento inmediato del rendimiento de la exportación. Puede haber un ligero retraso mientras Spanner realiza la división basada en la carga. Con la división basada en la carga, el rendimiento de la exportación aumentará y se estabilizará poco después. Para obtener más información sobre cómo maximizar el rendimiento de escritura, consulta el artículo Descripción general del rendimiento.

  • Especifica la prioridad HIGH en spanner_options. Sin embargo, esto puede provocar una degradación significativa del rendimiento de otras cargas de trabajo que se sirven en la misma instancia.

  • Evita ordenar los resultados de la consulta. Si el conjunto de resultados contiene todas las columnas de clave principal, el exportador ordena automáticamente las claves principales de la tabla de destino para agilizar las escrituras y minimizar la contención.

    Si la clave principal de la tabla de destino incluye columnas generadas, debes añadir las expresiones de las columnas generadas a la consulta para asegurarte de que los datos exportados se ordenen correctamente.

Precios

Cuando exportas datos a Spanner mediante la instrucción EXPORT DATA, se te factura según los precios de computación de capacidad de BigQuery. Para ejecutar consultas continuas, debes tener una asignación de reserva que use el tipo de tarea CONTINUOUS.

Las exportaciones de BigQuery a Spanner que cruzan fronteras regionales se cobran según las tarifas de extracción de datos. Para obtener más información, consulta los precios de BigQuery. Para evitar cargos por transferencia de datos, asegúrate de que la exportación de BigQuery se ejecute en la misma región que el líder predeterminado de Spanner. Las exportaciones de consultas continuas no admiten exportaciones que crucen límites regionales.

Una vez que se hayan exportado los datos, se te cobrará por almacenarlos en Spanner. Para obtener más información, consulta los precios de Spanner.