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 fuentes de datos de BigQuery, incluidas las tablas Iceberg, 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 te 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 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 suficiente anchura. Te recomendamos que añadas 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. Normalmente, 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.

  • Una tarea de BigQuery, como una tarea de extracción a Spanner, tiene una duración máxima de 6 horas. Para obtener información sobre cómo optimizar las tareas de extracción grandes, 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 extracció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.

  • 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 la columna de tipo TIMESTAMP de la tabla de Spanner de destino. Esta opción se usa durante la exportación para registrar la marca de tiempo de la actualización de la fila más reciente. Cuando se especifica esta opción, la exportación primero lee la fila de la tabla de Spanner para asegurarse de que solo se escribe la última actualización de la fila. Te recomendamos que especifiques una columna de tipo TIMESTAMP cuando ejecutes una exportación continua, en la que el orden de los cambios en las filas con la misma clave principal sea importante.
  • 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

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 continuamente una consulta de exportación, consulta las instrucciones y el código de ejemplo en el artículo Crear consultas continuas.

Optimización de exportación

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

  • Aumenta el número de nodos de la instancia de destino de Spanner. Durante las primeras fases de la exportación, aumentar el número de nodos de la instancia puede que no aumente inmediatamente el 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 aumenta y se estabiliza. Con la instrucción EXPORT DATA, se agrupan los datos para optimizar las escrituras en Spanner. Para obtener más información, consulta el artículo Vista general del rendimiento.

  • Especifica la prioridad HIGH en spanner_options. Si tu instancia de Spanner tiene habilitado el autoescalado, definir la prioridad HIGH ayuda a asegurar que el uso de CPU alcance el umbral necesario para activar el escalado. De esta forma, el escalador automático puede añadir recursos de computación en respuesta a la carga de exportación, lo que puede mejorar el rendimiento general de la exportación.

    En el siguiente ejemplo se muestra un comando de exportación de Spanner con prioridad HIGH:

    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", "priority": "HIGH" }"""
    )
  • 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, añada las expresiones de las columnas generadas a la consulta para asegurarse de que los datos exportados se ordenen y se agrupen correctamente.

    Por ejemplo, en el siguiente esquema de Spanner, SaleYear y SaleMonth son columnas generadas que forman el principio de la clave principal de Spanner:

    CREATE TABLE Sales (
      SaleId STRING(36) NOT NULL,
      ProductId INT64 NOT NULL,
      SaleTimestamp TIMESTAMP NOT NULL,
      Amount FLOAT64,
      -- Generated columns
      SaleYear INT64 AS (EXTRACT(YEAR FROM SaleTimestamp)) STORED,
      SaleMonth INT64 AS (EXTRACT(MONTH FROM SaleTimestamp)) STORED,
    ) PRIMARY KEY (SaleYear, SaleMonth, SaleId);

    Cuando exportas datos de BigQuery a una tabla de Spanner con columnas generadas que se usan en la clave principal, se recomienda, aunque no es obligatorio, incluir las expresiones de estas columnas generadas en la consulta EXPORT DATA. De esta forma, BigQuery puede preordenar los datos correctamente, lo cual es fundamental para agruparlos y escribirlos en Spanner de forma eficiente. Los valores de las columnas generadas en la instrucción EXPORT DATA no se confirman en Spanner, ya que Spanner los genera automáticamente, pero se usan para optimizar la exportación.

    En el siguiente ejemplo se exportan datos a una tabla de Sales de Spanner cuya clave principal usa columnas generadas. Para optimizar el rendimiento de escritura, la consulta incluye expresiones EXTRACT que coinciden con las columnas SaleYear y SaleMonth generadas, lo que permite a BigQuery preordenar los datos antes de la exportación:

    EXPORT DATA OPTIONS (
      uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
      format='CLOUD_SPANNER',
      spanner_options="""{ "table": "Sales" }"""
    )
    AS SELECT
      s.SaleId,
      s.ProductId,
      s.SaleTimestamp,
      s.Amount,
      -- Add expressions that match the generated columns in the Spanner PK
      EXTRACT(YEAR FROM s.SaleTimestamp) AS SaleYear,
      EXTRACT(MONTH FROM s.SaleTimestamp) AS SaleMonth
    FROM my_dataset.sales_export AS s;
  • Para evitar que las tareas se prolonguen demasiado, exporta los datos por partición. Fragmenta tus datos de BigQuery con una clave de partición, como una marca de tiempo en tu consulta:

    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", "priority": "MEDIUM" }"""
    )
    AS SELECT *
    FROM 'mydataset.table1' d
    WHERE
    d.timestamp >= TIMESTAMP '2025-08-28T00:00:00Z' AND
    d.timestamp < TIMESTAMP '2025-08-29T00:00:00Z';

    De esta forma, la consulta se completa en el tiempo de ejecución de la tarea, que es de 6 horas. Para obtener más información sobre estos límites, consulta los límites de trabajos de consulta.

  • Para mejorar el rendimiento de la carga de datos, elimina el índice de la tabla de Spanner en la que se importan los datos. Después, vuelve a crearlo cuando se haya completado la importación.

  • Te recomendamos que empieces con un nodo de Spanner (1000 unidades de procesador) y una reserva mínima de ranuras de BigQuery. Por ejemplo, 100 espacios o 0 espacios de referencia con autoescalado. En el caso de las exportaciones de menos de 100 GB, esta configuración suele completarse en el plazo de 6 horas que tienen los trabajos. En el caso de las exportaciones de más de 100 GB, aumenta el rendimiento ampliando los nodos de Spanner y las reservas de ranuras de BigQuery según sea necesario. El rendimiento se escala a aproximadamente 5 MiB/s por nodo.

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 exportar datos continuamente a Spanner mediante una consulta continua, debes tener una reserva de ranuras de BigQuery Enterprise o Enterprise Plus y 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 fronteras 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.