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
Crea una base de datos de Spanner que incluya una tabla para recibir los datos exportados.
Concede roles de gestión de identidades y accesos (IAM) que proporcionen a los usuarios los permisos necesarios para realizar cada tarea de este documento.
Crea una reserva Enterprise o de un nivel superior. Puedes reducir los costes de computación de BigQuery al ejecutar exportaciones únicas a Spanner si estableces una capacidad de slots de referencia de cero y habilitas el autoescalado.
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:
-
Exportar datos de una tabla de BigQuery:
Lector de datos de BigQuery (
roles/bigquery.dataViewer
) -
Ejecuta una tarea de exportación:
Usuario de BigQuery (
roles/bigquery.user
) -
Comprueba los parámetros de la instancia de Spanner:
Lector de Cloud Spanner (
roles/spanner.viewer
) -
Escribir datos en una tabla de Spanner:
Usuario de las bases de datos de Cloud Spanner (
roles/spanner.databaseUser
)
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 |
|
GoogleSQL |
|
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 tipoTIMESTAMP
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
yHIGH
. 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 proyectoINSTANCE_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 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
enspanner_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.