Exporta datos a Spanner (ETL inverso)
En este documento, se describe cómo configurar un flujo de trabajo inverso de extracción, transformación y carga (ETL inverso) de BigQuery a Spanner. Puedes hacerlo con la sentencia EXPORT DATA para exportar datos de fuentes de datos de BigQuery, incluidas las tablas de Iceberg, a una tabla de Spanner.
En este flujo de trabajo de ETL inverso, se combinan capacidades analíticas en BigQuery con baja latencia y alta capacidad de procesamiento en Spanner. Este flujo de trabajo te permite entregar datos a los usuarios de la aplicación sin agotar cuotas y límites en BigQuery.
Antes de comenzar
Crea una base de datos de Spanner que incluya una tabla para recibir los datos exportados.
Otorga roles de Identity and Access Management (IAM) que les brindan a los usuarios los permisos necesarios para realizar cada tarea de este documento.
Crea una reserva de Enterprise o de un nivel superior. Puedes reducir los costos de procesamiento de BigQuery cuando ejecutas exportaciones únicas a Spanner estableciendo una capacidad de ranuras de referencia de cero y habilitando el ajuste de escala automático.
Roles obligatorios
Para obtener los permisos que necesitas para exportar los datos de BigQuery a Spanner, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
-
Exportar datos desde una tabla de BigQuery:
Visualizador de datos de BigQuery (
roles/bigquery.dataViewer) -
Ejecutar un trabajo de extracción:
Usuario de BigQuery (
roles/bigquery.user) -
Verificar los parámetros de la instancia de Spanner:
Visualizador de Cloud Spanner (
roles/spanner.viewer) -
Escribir datos en una tabla de Spanner:
Usuario de base de datos de Cloud Spanner (
roles/spanner.databaseUser)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
Limitaciones
Esta función no es compatible con Assured Workloads.
Los siguientes tipos de datos de BigQuery no tienen equivalentes en Spanner y no son compatibles:
| Dialecto de la base de datos de Spanner | Tipos de BigQuery no compatibles |
|---|---|
| Todos los dialectos |
|
| GoogleSQL |
|
El tamaño máximo de una fila exportada no puede exceder 1 MiB.
Spanner aplica la integridad referencial durante la exportación. Si la tabla de destino es secundaria de otra tabla (INTERLEAVE IN PARENT) o si esta 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 superior no existe, la exportación fallará con el error "Falta la fila superior. No se puede escribir 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á con el error "Se incumplió la restricción de clave externa". Cuando exportes a varias tablas, te recomendamos que ordenes la exportación para asegurarte de que se mantenga la integridad referencial durante la exportación. Por lo general, esto significa exportar las tablas superiores y las tablas a las que hacen referencia las claves externas antes que las tablas que hacen referencia a ellas.
Si la tabla que es el destino de la exportación tiene restricciones de claves externas o es secundaria de otra tabla (INTERLEAVE IN PARENT), la tabla superior debe propagarse antes de exportar una tabla secundaria y debe contener todas las claves correspondientes. Fallará el intento de exportar una tabla secundaria mientras que una tabla superior no tenga el conjunto completo de claves relevantes.
Un trabajo de BigQuery, como un trabajo de extracción a Spanner, tiene una duración máxima de 6 horas. Para obtener información sobre cómo optimizar trabajos de extracción grandes, consulta Optimización de exportaciones. Como alternativa, considera dividir la entrada en bloques de datos individuales, que se pueden exportar como trabajos de extracción individuales.
Las exportaciones a Spanner solo se admiten en las ediciones Enterprise o Enterprise Plus de BigQuery. No se admiten la edición Standard de BigQuery ni el procesamiento on demand.
No puedes usar consultas continuas para exportar a tablas de Spanner con claves primarias generadas automáticamente.
No puedes usar consultas continuas para exportar a tablas de Spanner en una base de datos con dialecto de PostgreSQL.
Cuando uses consultas continuas para exportar a una tabla de Spanner, asegúrate de elegir una clave primaria que no corresponda a un número entero que aumente de forma monotónica en tu tabla de BigQuery. De lo contrario, es posible que se produzcan problemas de rendimiento en la exportación. Para obtener información sobre las claves primarias en Spanner y las formas de mitigar estos problemas de rendimiento, consulta Elige una clave primaria.
Configura exportaciones con la opción spanner_options
Puedes usar la opción spanner_options para especificar una base de datos y una tabla de destino de Spanner. La configuración se expresa en forma de una 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", }""" )
Reemplaza lo siguiente:
PROJECT_ID: Es el nombre de tu proyecto de Google Cloud .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 existente.CHANGE_TIMESTAMP: Es el nombre de la columna de tipoTIMESTAMPen la tabla de Spanner de destino. Esta opción se usa durante la exportación para hacer un seguimiento de la marca de tiempo de la actualización de fila más reciente. Cuando se especifica esta opción, la exportación primero realiza una lectura de la fila en la tabla de Spanner para garantizar que solo se escriba la actualización de fila más reciente. Te recomendamos que especifiques una columna de tipoTIMESTAMPcuando ejecutes una exportación continua, en la que el orden de los cambios en las filas con la misma clave primaria sea importante.PRIORITY(opcional): Es la prioridad de las solicitudes de escritura. Valores permitidos:LOW,MEDIUM,HIGH. Valor predeterminado:MEDIUM.TAG(opcional): Es la etiqueta de solicitud para ayudar a identificar el tráfico del exportador en la supervisión de Spanner. Valor predeterminado:bq_export.
Requisitos de las consultas de exportación
Para exportar los resultados de las consultas a Spanner, estos deben cumplir con 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 NULLde la tabla de destino. - Los valores de la columna no deben exceder los límites de tamaño de los datos dentro de las tablas de Spanner.
- Los tipos de columnas no compatibles deben convertirse en uno de los tipos compatibles antes de exportar a Spanner.
Tipos de conversiones
Para facilitar el uso, el exportador de Spanner aplica automáticamente las siguientes conversiones de tipo:
| Tipo de BigQuery | Tipo de Spanner |
|---|---|
| BIGNUMERIC | NUMERIC (solo para el dialecto de PostgreSQL) |
| FLOAT64 | FLOAT32 |
| BYTES | PROTO |
| INT64 | ENUM |
Exportar datos
Puedes usar la declaració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;
Reemplaza lo siguiente:
PROJECT_ID: Es el nombre de tu proyecto de Google Cloud .INSTANCE_ID: el nombre de tu instancia de base de datosDATABASE_ID: el nombre de tu base de datosTABLE_NAME: el nombre de una tabla de destino existente
Exporta 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. Solo se incluirá una sola fila de BigQuery coincidente (no se garantiza cuál) en el conjunto de filas de Spanner que produce la exportación.
Exporta con una conexión CLOUD_RESOURCE
Puedes delegar permisos de escritura en una conexión CLOUD_RESOURCE de BigQuery para ejecutar exportaciones sin otorgar a un usuario acceso directo a la base de datos de Spanner.
Antes de exportar a Spanner con una conexión CLOUD_RESOURCE, haz lo siguiente:
Crear una conexión
Puedes crear o usar una conexión CLOUD_RESOURCE existente para conectarte a Spanner.
Console
Ve a la página de BigQuery.
En el panel de la izquierda, haz clic en Explorar.

Si no ves el panel izquierdo, haz clic en Expandir panel izquierdo para abrirlo.
En el panel Explorador, expande el nombre de tu proyecto y, luego, haz clic en Conexiones.
En la página Connections, haz clic en Create connection.
En Tipo de conexión, elige Modelos remotos de Vertex AI, funciones remotas, BigLake y Spanner (Cloud Resource).
En el campo ID de conexión, ingresa un nombre para tu conexión.
En Tipo de ubicación, selecciona una ubicación para tu conexión. La conexión debe estar ubicada junto con tus otros recursos, como los conjuntos de datos.
Haz clic en Crear conexión.
Haz clic en Ir a la conexión.
En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.
SQL
Usa la sentencia CREATE CONNECTION:
En la consola de Google Cloud , ve a la página BigQuery.
En el editor de consultas, escribe la siguiente oración:
CREATE CONNECTION [IF NOT EXISTS] `CONNECTION_NAME` OPTIONS ( connection_type = "CLOUD_RESOURCE", friendly_name = "FRIENDLY_NAME", description = "DESCRIPTION" );
Reemplaza lo siguiente:
-
CONNECTION_NAME: Es el nombre de la conexión en formatoPROJECT_ID.LOCATION.CONNECTION_ID,LOCATION.CONNECTION_IDoCONNECTION_ID. Si se omiten el proyecto o la ubicación, se infieren del proyecto y la ubicación en los que se ejecuta la instrucción. -
FRIENDLY_NAME(opcional): Es un nombre descriptivo para la conexión. -
DESCRIPTION(opcional): Es una descripción de la conexión.
-
Haz clic en Ejecutar.
Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.
bq
En un entorno de línea de comandos, crea una conexión:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
El parámetro
--project_idanula el proyecto predeterminado.Reemplaza lo siguiente:
REGION: tu región de conexiónPROJECT_ID: El ID de tu proyecto de Google CloudCONNECTION_ID: Es un ID para tu conexión.
Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia con la conexión.
Solución de problemas: Si recibes el siguiente error de conexión, actualiza el SDK de Google Cloud:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Recupera y copia el ID de cuenta de servicio para usarlo en un paso posterior:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
El resultado es similar a lo siguiente:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Python
Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Node.js
Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Terraform
Usa el recurso google_bigquery_connection.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
En el siguiente ejemplo, se crea una conexión de recursos de Cloud llamada my_cloud_resource_connection en la región US:
Para aplicar tu configuración de Terraform en un proyecto de Google Cloud , completa los pasos de las siguientes secciones.
Prepara Cloud Shell
- Inicia Cloud Shell
-
Establece el proyecto Google Cloud predeterminado en el que deseas aplicar tus configuraciones de Terraform.
Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Las variables de entorno se anulan si configuras valores explícitos en el archivo de configuración de Terraform.
Prepara el directorio
Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).
-
En Cloud Shell, crea un directorio y un archivo nuevo dentro de ese directorio. El nombre del archivo debe tener la extensión
.tf, por ejemplo,main.tf. En este instructivo, el archivo se denominamain.tf.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.
Copia el código de muestra en el
main.tfrecién creado.De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.
- Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
- Guarda los cambios.
-
Inicializa Terraform. Solo debes hacerlo una vez por directorio.
terraform init
De manera opcional, incluye la opción
-upgradepara usar la última versión del proveedor de Google:terraform init -upgrade
Aplica los cambios
-
Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
terraform plan
Corrige la configuración según sea necesario.
-
Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe
yescuando se te solicite:terraform apply
Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.
- Abre tu proyecto Google Cloud para ver los resultados. En la consola de Google Cloud , navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.
Después de crear la conexión, ábrela. En el panel Información de conexión, copia el ID de la cuenta de servicio. Necesitarás este ID cuando configures los permisos para la conexión. Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia con la conexión.
Configura el acceso
Debes otorgar a la cuenta de servicio asociada con la conexión nueva acceso de escritura a tu instancia o base de datos de Spanner. Te recomendamos que uses el rol de IAM predefinido Usuario de base de datos de Cloud Spanner (roles/spanner.databaseUser).
Para completar estos pasos, necesitas el ID de la cuenta de servicio que copiaste cuando creaste la conexión.
Para otorgar acceso a los roles a nivel de la base de datos para la cuenta de servicio, haz lo siguiente:
Ve a la página de instancias de Spanner.
Haz clic en el nombre de la instancia que contiene tu base de datos.
En la pestaña Descripción general, selecciona la casilla de verificación de tu base de datos.
Aparecerá el diálogo Panel de información. Haz clic en Agregar principal.
En Principales nuevas, ingresa el ID de la cuenta de servicio que copiaste antes.
En el campo Seleccionar un rol, selecciona un rol con permisos de
spanner.databases.write. Te recomendamos que uses el rol Usuario de base de datos de Cloud Spanner.Haz clic en Guardar.
Ejecuta la exportación con la conexión CLOUD_RESOURCE
Una vez que se crea la conexión y se le otorga el acceso adecuado, puedes ejecutar la exportación con la conexión CLOUD_RESOURCE. En el siguiente ejemplo, se muestra un comando EXPORT que se exporta con una conexión CLOUD_RESOURCE.
EXPORT DATA WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME` OPTIONS ( uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID", format='CLOUD_SPANNER', spanner_options="""{ "table": "SPANNER_TABLE_NAME" }""" ) AS SELECT * FROM my_bq_dataset.table1;
Reemplaza lo siguiente:
PROJECT_ID: Es el nombre de tu proyecto de Google Cloud .LOCATION: Es la ubicación en la que creaste la conexión, por ejemplo,us.CONNECTION_NAME: Es el nombre de la conexión que se usa para ejecutar la exportación, por ejemplo,myconnection.INSTANCE_ID: Es el nombre de tu instancia de base de datos de Spanner.DATABASE_ID: Es el nombre de tu base de datos de Spanner.SPANNER_TABLE_NAME: Es el nombre de la tabla de Spanner de destino existente.
Exporta continuamente
Para procesar una consulta de exportación de forma continua, consulta Crea consultas continuas para obtener instrucciones y código de ejemplo.
Optimización de exportaciones
Para optimizar la exportación de registros de BigQuery a Spanner, puedes probar lo siguiente:
Aumenta la cantidad de nodos en la instancia de destino de Spanner. Durante las primeras etapas de la exportación, es posible que aumentar la cantidad de nodos en la instancia no aumente de inmediato la capacidad de procesamiento de la exportación. Puede haber una ligera demora mientras Spanner realiza la división basada en la carga. Con la división basada en la carga, la capacidad de procesamiento de exportación aumenta y se estabiliza. La instrucción
EXPORT DATAusa datos por lotes para optimizar las escrituras en Spanner. Para obtener más información, consulta la Descripción general del rendimiento.Especifica la prioridad de
HIGHenspanner_options. Si tu instancia de Spanner tiene habilitado el ajuste de escala automático, establecer la prioridad deHIGHayuda a garantizar que el uso de CPU alcance el umbral necesario para activar el ajuste de escala. Esto permite que el escalador automático agregue recursos de procesamiento 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 establecido en la 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": "LOW" }""" )Evita ordenar los resultados de la consulta. Si el conjunto de resultados contiene todas las columnas de clave primaria, el exportador ordena automáticamente las claves primarias de la tabla de destino para optimizar las escrituras y minimizar la contención.
Si la clave primaria de la tabla de destino incluye columnas generadas, agrega las expresiones de las columnas generadas a la consulta para asegurarte de que los datos exportados se ordenen y agrupen de forma correcta.
Por ejemplo, en el siguiente esquema de Spanner,
SaleYearySaleMonthson columnas generadas que componen el comienzo de la clave primaria 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 para estas columnas generadas en tu consulta
EXPORT DATA. Esto permite que BigQuery ordene previamente los datos de forma correcta, lo que es fundamental para el procesamiento por lotes y la escritura en Spanner eficientes. Los valores de las columnas generadas en la sentenciaEXPORT DATAno 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
Salesde Spanner cuya clave primaria usa columnas generadas. Para optimizar el rendimiento de escritura, la consulta incluye expresionesEXTRACTque coinciden con las columnasSaleYearySaleMonthgeneradas, lo que permite que BigQuery ordene previamente 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 trabajos de larga duración, 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';Esto permite que la consulta se complete dentro del tiempo de ejecución del trabajo 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, quita el índice de la tabla de Spanner en la que se importan los datos. Luego, vuelve a crearla después de que se complete la importación.
Te recomendamos que comiences con un nodo de Spanner (1,000 unidades de procesamiento) y una reserva mínima de ranura de BigQuery. Por ejemplo, 100 ranuras o 0 ranuras de referencia con ajuste de escala automático. En el caso de las exportaciones de menos de 100 GB, esta configuración suele completarse dentro del límite de 6 horas del trabajo. Para las exportaciones de más de 100 GB, aumenta el rendimiento escalando los nodos de Spanner y las reservas de ranura de BigQuery según sea necesario. La capacidad de procesamiento se ajusta a aproximadamente 5 MiB/s por nodo.
Precios
Cuando exportas datos a Spanner con la sentencia EXPORT DATA, se te factura a través de los precios de procesamiento de capacidad de BigQuery.
Para exportar datos de forma continua a Spanner con una consulta continua, debes tener una reserva de ranuras de la edición Enterprise o Enterprise Plus de BigQuery y una asignación de reserva que use el tipo de trabajo CONTINUOUS.
Las exportaciones de BigQuery a Spanner que cruzan límites regionales se cobran según las tarifas de extracción de datos. Si deseas obtener más información, consulta los Precios de BigQuery. Para evitar cargos por transferencia de datos, asegúrate de que tu exportación de BigQuery se ejecute en la misma región que el líder predeterminado de Spanner.
Una vez que se exportan los datos, se te cobra por almacenarlos en Spanner. Para obtener más información, consulta Precios de Spanner.