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

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:

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
  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME
GoogleSQL
  • BIGNUMERIC: El tipo NUMERIC admitido no es lo suficientemente ancho. Considera agregar conversiones explícitas al tipo NUMERIC en la consulta.
  • 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 tipo TIMESTAMP en 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 tipo TIMESTAMP cuando 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 NULL de 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 datos
  • DATABASE_ID: el nombre de tu base de datos
  • TABLE_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.

Selecciona una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel de la izquierda, haz clic en Explorar.

    Botón destacado del panel Explorador.

    Si no ves el panel izquierdo, haz clic en Expandir panel izquierdo para abrirlo.

  3. En el panel Explorador, expande el nombre de tu proyecto y, luego, haz clic en Conexiones.

  4. En la página Connections, haz clic en Create connection.

  5. En Tipo de conexión, elige Modelos remotos de Vertex AI, funciones remotas, BigLake y Spanner (Cloud Resource).

  6. En el campo ID de conexión, ingresa un nombre para tu conexión.

  7. 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.

  8. Haz clic en Crear conexión.

  9. Haz clic en Ir a la conexión.

  10. 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:

  1. En la consola de Google Cloud , ve a la página BigQuery.

    Ir a BigQuery

  2. 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 formato PROJECT_ID.LOCATION.CONNECTION_ID, LOCATION.CONNECTION_ID o CONNECTION_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.

  3. Haz clic en Ejecutar.

Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

bq

  1. 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_id anula el proyecto predeterminado.

    Reemplaza lo siguiente:

    • REGION: tu región de conexión
    • PROJECT_ID: El ID de tu proyecto de Google Cloud
    • CONNECTION_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...
    
  2. 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.

import google.api_core.exceptions
from google.cloud import bigquery_connection_v1

client = bigquery_connection_v1.ConnectionServiceClient()


def create_connection(
    project_id: str,
    location: str,
    connection_id: str,
):
    """Creates a BigQuery connection to a Cloud Resource.

    Cloud Resource connection creates a service account which can then be
    granted access to other Google Cloud resources for federated queries.

    Args:
        project_id: The Google Cloud project ID.
        location: The location of the connection (for example, "us-central1").
        connection_id: The ID of the connection to create.
    """

    parent = client.common_location_path(project_id, location)

    connection = bigquery_connection_v1.Connection(
        friendly_name="Example Connection",
        description="A sample connection for a Cloud Resource.",
        cloud_resource=bigquery_connection_v1.CloudResourceProperties(),
    )

    try:
        created_connection = client.create_connection(
            parent=parent, connection_id=connection_id, connection=connection
        )
        print(f"Successfully created connection: {created_connection.name}")
        print(f"Friendly name: {created_connection.friendly_name}")
        print(
            f"Service Account: {created_connection.cloud_resource.service_account_id}"
        )

    except google.api_core.exceptions.AlreadyExists:
        print(f"Connection with ID '{connection_id}' already exists.")
        print("Please use a different connection ID.")
    except Exception as e:
        print(f"An unexpected error occurred while creating the connection: {e}")

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.

const {ConnectionServiceClient} =
  require('@google-cloud/bigquery-connection').v1;
const {status} = require('@grpc/grpc-js');

const client = new ConnectionServiceClient();

/**
 * Creates a new BigQuery connection to a Cloud Resource.
 *
 * A Cloud Resource connection creates a service account that can be granted access
 * to other Google Cloud resources.
 *
 * @param {string} projectId The Google Cloud project ID. for example, 'example-project-id'
 * @param {string} location The location of the project to create the connection in. for example, 'us-central1'
 * @param {string} connectionId The ID of the connection to create. for example, 'example-connection-id'
 */
async function createConnection(projectId, location, connectionId) {
  const parent = client.locationPath(projectId, location);

  const connection = {
    friendlyName: 'Example Connection',
    description: 'A sample connection for a Cloud Resource',
    // The service account for this cloudResource will be created by the API.
    // Its ID will be available in the response.
    cloudResource: {},
  };

  const request = {
    parent,
    connectionId,
    connection,
  };

  try {
    const [response] = await client.createConnection(request);

    console.log(`Successfully created connection: ${response.name}`);
    console.log(`Friendly name: ${response.friendlyName}`);

    console.log(`Service Account: ${response.cloudResource.serviceAccountId}`);
  } catch (err) {
    if (err.code === status.ALREADY_EXISTS) {
      console.log(`Connection '${connectionId}' already exists.`);
    } else {
      console.error(`Error creating connection: ${err.message}`);
    }
  }
}

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:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

Para aplicar tu configuración de Terraform en un proyecto de Google Cloud , completa los pasos de las siguientes secciones.

Prepara Cloud Shell

  1. Inicia Cloud Shell
  2. 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).

  1. 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 denomina main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 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.tf recié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.

  3. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
  4. Guarda los cambios.
  5. Inicializa Terraform. Solo debes hacerlo una vez por directorio.
    terraform init

    De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

    terraform init -upgrade

Aplica los cambios

  1. 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.

  2. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:
    terraform apply

    Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

  3. 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:

  1. Ve a la página de instancias de Spanner.

    Ir a la página Instancias

  2. Haz clic en el nombre de la instancia que contiene tu base de datos.

  3. En la pestaña Descripción general, selecciona la casilla de verificación de tu base de datos.

  4. Aparecerá el diálogo Panel de información. Haz clic en Agregar principal.

  5. En Principales nuevas, ingresa el ID de la cuenta de servicio que copiaste antes.

  6. 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.

  7. 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 DATA usa 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 HIGH en spanner_options. Si tu instancia de Spanner tiene habilitado el ajuste de escala automático, establecer la prioridad de HIGH ayuda 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, SaleYear y SaleMonth son 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 sentencia 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 Sales de Spanner cuya clave primaria 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 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.