Exportar datos a Bigtable (ETL inverso)
En este documento se describe cómo puede configurar la extracción, transformación y carga inversas (RETL) de BigQuery a Bigtable. Para ello, puedes usar la sentencia EXPORT
DATA
para exportar datos de una tabla de BigQuery a una tabla de Bigtable.
Puedes usar un flujo de trabajo de RETL en Bigtable para combinar las funciones analíticas de BigQuery con la baja latencia y el alto rendimiento de Bigtable. Este flujo de trabajo te permite proporcionar datos a los usuarios de la aplicación sin agotar las cuotas ni los límites de BigQuery.
Características de las tablas de Bigtable
Las tablas de Bigtable se diferencian de las tablas de BigQuery en varios aspectos:
- Tanto las tablas de Bigtable como las de BigQuery están formadas por filas, pero una fila de Bigtable se compone de una clave de fila y familias de columnas que tienen un número arbitrario de columnas pertenecientes a la misma familia de columnas.
- Las familias de columnas de una tabla determinada se crean cuando se crea la tabla, pero también se pueden añadir o quitar más adelante. Cuando se crea una familia de columnas, no es necesario especificar las columnas que pertenecen a ella.
- No es necesario definir las columnas de Bigtable con antelación y se pueden usar para almacenar datos en su nombre (también conocido como calificador) dentro de los límites de tamaño de los datos de las tablas.
- Las columnas de Bigtable pueden tener cualquier valor binario dentro de los límites de tamaño de los datos de las tablas.
- Las columnas de Bigtable siempre tienen una dimensión temporal (también conocida como versión). Se puede almacenar cualquier número de valores en cualquier fila de la misma columna, siempre que la marca de tiempo no sea idéntica.
- Las marcas de tiempo de Bigtable se miden en microsegundos desde el tiempo de la época de Unix. Por ejemplo, 0 representa el 1 de enero de 1970 a las 00:00:00 UTC. Las marcas de tiempo deben ser un número no negativo de microsegundos con una granularidad de milisegundos (solo se aceptan múltiplos de 1000 µs). La marca de tiempo predeterminada de Bigtable es 0.
- Los datos de Bigtable se leen por clave de fila, varias claves de fila, un intervalo de claves de fila o mediante un filtro. Se requiere al menos una clave de fila o un intervalo de claves de fila en todos los tipos de solicitudes de lectura, excepto en el análisis completo de una tabla.
Para obtener información sobre cómo preparar los resultados de BigQuery para exportarlos a Bigtable, consulta Preparar resultados de consultas para exportarlos.
Antes de empezar
Para recibir los datos exportados, debes crear una instancia de Bigtable y una tabla de Bigtable.
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.
Roles obligatorios
Para obtener los permisos que necesitas para exportar datos de BigQuery a Bigtable, pide a tu administrador que te conceda 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
) -
Escribir datos en una tabla de Bigtable:
Usuario de Bigtable (
roles/bigtable.user
) -
Para crear automáticamente familias de columnas en una tabla de Bigtable, sigue estos pasos:
Administrador de Bigtable (
roles/bigtable.admin
)
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
- La codificación solo se limita a
BINARY
yTEXT
. - El perfil de aplicación de Bigtable de destino debe configurarse con enrutamiento de un solo clúster y un nivel de prioridad de solicitud bajo.
- El perfil de aplicación de Bigtable debe configurarse para enrutar los datos a un clúster de Bigtable ubicado en el mismo lugar que el conjunto de datos de BigQuery. Para obtener más información, consulta Cuestiones importantes sobre ubicación.
- Las exportaciones a Bigtable solo se admiten en las ediciones Enterprise o Enterprise Plus de BigQuery. La edición Estándar de BigQuery y la computación bajo demanda no se admiten.
- Las exportaciones a Bigtable solo se admiten en las reservas con una
QUERY
asignación.
Consideraciones de ubicación
- Si tu conjunto de datos de BigQuery está en una multirregión, tu
perfil de aplicación de Bigtable
debe configurarse para enrutar los datos a un clúster de Bigtable dentro de esa multirregión.
Por ejemplo, si tu conjunto de datos de BigQuery está en la
US
multirregión, el clúster de Bigtable puede estar ubicado en la regiónus-west1
(Oregón), que está en Estados Unidos. - Si tu conjunto de datos de BigQuery está en una sola región, tu perfil de aplicación de Bigtable
debe configurarse para enrutar los datos a un clúster de Bigtable en
la misma región. Por ejemplo, si tu conjunto de datos de BigQuery está en la región
asia-northeast1
(Tokio), tu clúster de Bigtable también debe estar en la regiónasia-northeast1
(Tokio).
Para obtener más información, consulta Ubicaciones de Bigtable.
Tipos de BigQuery admitidos
Se admiten los siguientes tipos de datos cuando se escriben en Bigtable:
Tipo de BigQuery | Valor de Bigtable escrito |
---|---|
BYTES |
Se exporta tal cual. |
STRING |
Convertida a BYTES . |
INTEGER |
Si bigtable_options.column_families.encoding se define como
BINARY , el valor se escribe en un formato big-endian de 8 bytes
(byte más significativo
primero). Si bigtable_options.column_families.encoding se define como TEXT , el valor se escribe como una cadena legible por humanos que representa un número. |
FLOAT |
Escribe el valor en el formato de salida de 8 bytes IEEE 754. |
BOOLEAN |
Si bigtable_options.column_families.encoding se define como BINARY , el valor se escribe como un valor de 1 byte (false = 0x00 o true = 0x01). Si bigtable_options.column_families.encoding se define como TEXT , el valor se escribe como texto ("true" o "false" ). |
JSON |
Una columna exportada de tipo
JSON se interpreta como un grupo de columnas que pertenecen a una familia de columnas de Bigtable específica. Los miembros del objeto JSON se interpretan como columnas y sus valores se escriben en Bigtable. El nombre de la columna que se va a escribir se puede ajustar mediante la configuración bigtable_options . Por ejemplo:
JSON '{"FIELD1": "VALUE1", "FIELD2": "VALUE2"}' as MY_COLUMN_FAMILY Los valores VALUE1 y VALUE2 se escriben en Bigtable como columnas FIELD1 y FIELD2 en la familia de columnas MY_COLUMN_FAMILY.
|
STRUCT |
Una columna exportada de tipo
STRUCT se interpreta como un grupo de columnas que pertenecen a una familia de columnas de Bigtable específica. Los miembros de la estructura se interpretan como columnas y sus valores se escriben en Bigtable. El nombre de la columna que se va a escribir se puede ajustar mediante la configuración bigtable_options . Por ejemplo:
STRUCT<FIELD1 STRING, FIELD2 INTEGER> as MY_COLUMN_FAMILY Los valores FIELD1 y FIELD2 se escriben en Bigtable como columnas FIELD1 y FIELD2 en la familia de columnas MY_COLUMN_FAMILY.
|
Estos tipos de datos admitidos son similares a los que se usan para leer datos de tablas externas de Bigtable en BigQuery.
Valores de NULL
en Bigtable
Los valores NULL
de Bigtable tienen las siguientes restricciones:
Bigtable no tiene ningún análogo para los valores de
NULL
. Al exportar un valorNULL
de una familia de columnas y una columna concretas de Bigtable, se eliminan los valores actuales de una fila de Bigtable.Si no existe un valor de Bigtable con una clave de fila, una familia de columnas, un calificador de columna y una marca de tiempo determinados antes de la exportación, los valores de
NULL
exportados no tendrán ningún efecto en la fila de Bigtable.Al exportar un valor
NULL
de tipoSTRUCT
oJSON
, se eliminan todos los valores de la columna que pertenezcan a la familia de columnas correspondiente de la fila afectada. Debe convertir el valorNULL
al tipoSTRUCT
oJSON
para que el motor de SQL le asigne el tipo correcto. La siguiente consulta elimina todos los datos de la familia de columnascolumn_family1
con un conjunto de claves de fila determinado:EXPORT DATA OPTIONS (...) AS SELECT rowkey, CAST(NULL as STRUCT<INT64>) AS column_family1 FROM T
Las filas con
NULL
claves de fila se omiten durante la exportación. El número de filas omitidas se devuelve en las estadísticas de exportación a la persona que llama.
Configurar exportaciones con bigtable_options
Puede usar la configuración bigtable_options
durante una exportación para salvar las diferencias entre los modelos de almacenamiento de BigQuery y Bigtable. La configuración se expresa en forma de cadena JSON, como se muestra en el siguiente ejemplo:
EXPORT DATA OPTIONS( uri="https://bigtable.googleapis.com/projects/PROJECT_ID
/instances/INSTANCE_ID
/appProfiles/APP_PROFILE_ID
/tables/TABLE
", bigtable_options = """{ "columnFamilies": [{ "familyId": "COLUMN_FAMILY_NAME
", "encoding": "ENCODING_VALUE
", "columns": [ { "qualifierString": "BIGTABLE_COLUMN_QUALIFIER
", ["qualifierEncoded": "BASE_64_ENCODED_VALUE
",] "fieldName": "BIGQUERY_RESULT_FIELD_NAME
" } ] }] }""" )
En la siguiente tabla se describen los campos que se pueden usar en una configuración de bigtable_options
:
Nombre del campo | Descripción |
---|---|
columnFamilies |
Matriz de descriptores de familias de columnas. |
columnFamilies.familyId |
Identificador de la familia de columnas de Bigtable. |
columnFamilies.encoding |
El valor puede ser BINARY o TEXT . Para obtener información sobre cómo se codifican los tipos, consulta Tipos de BigQuery admitidos. |
columnFamilies.columns |
Matriz de asignaciones de columnas de Bigtable. |
columnFamilies.columns.qualifierString |
Opcional: un calificador de columna de Bigtable. Especifica este valor si el calificador de columna no tiene códigos que no sean UTF-8. Los campos qualifierString y qualifierEncoding se excluyen entre sí. Si no se especifica ni qualifierString ni qualifierEncoded , se usa fieldName como calificador de columna. |
columnFamilies.columns.qualifierEncoded |
Opcional: calificador de columna codificado en Base64. Similar a qualifierString en caso de que el calificador de columna deba tener códigos que no sean UTF-8. |
columnFamilies.columns.fieldName |
Obligatorio: nombre del campo del conjunto de resultados de BigQuery. Puede ser una cadena vacía en algunos casos. Para ver un ejemplo de cómo se usa un valor fieldName vacío con campos de tipos simples, consulta Preparar resultados de consultas para exportar. |
Preparar los resultados de una consulta para exportarlos
Para exportar los resultados de una consulta a Bigtable, estos deben cumplir los siguientes requisitos:
- El conjunto de resultados debe contener una columna
rowkey
de tipoSTRING
oBYTES
. - Las claves de las filas, los calificadores de las columnas, los valores y las marcas de tiempo no deben superar los límites de tamaño de los datos de Bigtable en las tablas.
- El conjunto de resultados debe incluir al menos una columna que no sea
rowkey
. - Cada columna del conjunto de resultados debe ser de uno de los tipos de BigQuery admitidos. Los tipos de columna no admitidos deben convertirse a uno de los tipos admitidos antes de exportar a Bigtable.
Bigtable no requiere que los calificadores de columna sean nombres de columna de BigQuery válidos y admite el uso de cualquier byte. Para obtener información sobre cómo anular los cualificadores de columna de destino de una exportación, consulta Configurar exportaciones con bigtable_options
.
Si usas valores exportados con APIs de Bigtable, como ReadModifyWriteRow
, los valores numéricos deben usar la codificación binaria correcta.
De forma predeterminada, las columnas de resultados independientes de tipos distintos de STRUCT
o JSON
se interpretan como valores de familias de columnas de destino iguales al nombre de la columna de resultados y como calificadores de columna iguales a una cadena vacía.
Para mostrar cómo se escriben estos tipos de datos, consulta el siguiente ejemplo de SQL, donde column
y column2
son columnas de resultados independientes:
SELECT
x as column1, y as column2
FROM table
En esta consulta de ejemplo, SELECT x as column1
escribe valores en Bigtable
en la familia de columnas column1
y en el calificador de columna ''
(cadena vacía) cuando
gestiona tipos distintos de JSON
o STRUCT
.
Puedes cambiar la forma en que se escriben estos tipos en una exportación mediante la configuración bigtable_options
, como se muestra en el siguiente ejemplo:
EXPORT DATA OPTIONS ( … bigtable_options="""{ "columnFamilies" : [ { "familyId": "ordered_at", "columns": [ {"qualifierString": "order_time", "fieldName": ""} ] } ] }""" ) AS SELECT order_id as rowkey, STRUCT(product, amount) AS sales_info, EXTRACT (MILLISECOND FROM order_timestamp AT TIME ZONE "UTC") AS ordered_at FROM T
En este ejemplo, la tabla de BigQuery T
contiene la siguiente fila:
order_id |
order_timestamp |
product |
amount |
---|---|---|---|
101 | 2023-03-28T10:40:54Z | Joystick | 2 |
Si usas la configuración bigtable_options
anterior con la tabla T
, se escribirán los siguientes datos en Bigtable:
rowkey |
sales_info (familia de columnas) |
ordered_at (familia de columnas) |
|||
---|---|---|---|---|---|
101 | producto | amount | order_time | ||
1970-01-01T00:00:00Z | Joystick | 1970-01-01T00:00:00Z | 2 | 1680000054000 |
1680000054000
representa 2023-03-28T10:40:54Z
en milisegundos desde el inicio del registro de tiempo Unix en la zona horaria UTC.
Crear automáticamente familias de columnas
Para crear automáticamente familias de columnas en una tabla de Bigtable, define la opción auto_create_column_families
de la instrucción EXPORT DATA
en true
. Esta opción requiere el permiso bigtable.tables.update
, que se incluye en roles como Administrador de Bigtable (roles/bigtable.admin
).
EXPORT DATA OPTIONS (
uri="https://bigtable.googleapis.com/projects/PROJECT-ID/instances/INSTANCE-ID/appProfiles/APP_PROFILE_ID
/tables/TABLE",
format="CLOUD_BIGTABLE",
auto_create_column_families = true
) AS
SELECT
order_id as rowkey,
STRUCT(product, amount) AS sales_info
FROM T
Definir la marca de tiempo de todas las celdas de una fila con _CHANGE_TIMESTAMP
Puede añadir una columna _CHANGE_TIMESTAMP
de tipo TIMESTAMP
al resultado para exportarlo.
Cada celda escrita en Bigtable usa el valor de marca de tiempo de la _CHANGE_TIMESTAMP
de la fila de resultados exportada.
Bigtable no admite marcas de tiempo anteriores al registro de tiempo de Unix (1970-01-01T00:00:00Z). Si el valor de _CHANGE_TIMESTAMP
es NULL
, se usa la hora de inicio del registro de tiempo de Unix de 0
como valor de marca de tiempo predeterminado.
La siguiente consulta escribe celdas de las columnas product
y amount
con la marca de tiempo especificada en la columna order_timestamp
de la tabla T
.
EXPORT DATA OPTIONS (...) AS SELECT rowkey, STRUCT(product, amount) AS sales_info, order_timestamp as _CHANGE_TIMESTAMP FROM T
Exportar de forma continua
Si quieres procesar continuamente una consulta de exportación, puedes configurarla como una consulta continua.
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 Bigtable terminan en la misma fila de Bigtable.
Puedes usar este método para generar varias versiones de los valores de columna en la misma fila. En este ejemplo, la tabla orders
de BigQuery contiene los siguientes datos:
id |
customer |
order_timestamp |
amount_spent |
---|---|---|---|
100 | Roberto | 2023-01-01T10:10:54Z | 10,99 € |
101 | Alice | 2023-01-02T12:10:50Z | 102,7 |
102 | Roberto | 2023-01-04T15:17:01Z | 11.1 |
A continuación, el usuario ejecuta la siguiente instrucción EXPORT DATA
:
EXPORT DATA OPTIONS (
uri="https://bigtable.googleapis.com/projects/PROJECT-ID/instances/INSTANCE-ID/appProfiles/APP_PROFILE_ID
/tables/TABLE",
format="CLOUD_BIGTABLE"
) AS
SELECT customer as rowkey, STRUCT(amount_spent) as orders_column_family, order_timestamp as _CHANGE_TIMESTAMP
FROM orders
Si se usa esta instrucción con la tabla orders
de BigQuery, se escribirán los siguientes datos en Bigtable:
orders_column_family | ||
---|---|---|
Clave de fila | amount_spent | |
Alice | 2023-01-02T12:10:50Z | 102,7 |
Roberto | 2023-01-01T10:10:54Z | 10,99 € |
2023-01-04T15:17:01Z | 11.1 |
Al exportar a Bigtable, los valores nuevos se combinan en la tabla en lugar de sustituir filas completas. Si ya hay valores en Bigtable para una clave de fila, los nuevos valores pueden sobrescribir parcial o totalmente los valores anteriores en función de la familia de columnas, los nombres de las columnas y las marcas de tiempo de las celdas que se escriban.
Exportar varias columnas como valores de Protocol Buffer (Protobuf)
Los buffers de protocolo proporcionan un mecanismo flexible y eficiente para serializar datos estructurados. Exportar como Protobuf puede ser útil si tenemos en cuenta cómo se gestionan los diferentes tipos entre BigQuery y Bigtable. Puede usar funciones definidas por el usuario (UDFs) de BigQuery para exportar datos como valores binarios de Protobuf a Bigtable. Para obtener más información, consulta Exportar datos como columnas Protobuf.
Optimización de exportación
Puedes cambiar el rendimiento al que se exportan los registros de BigQuery a Bigtable modificando el número de nodos del clúster de destino de Bigtable. El rendimiento (filas escritas por segundo) se escala de forma lineal con el número de nodos del clúster de destino. Por ejemplo, si duplicas el número de nodos de tu clúster de destino, el rendimiento de exportación se duplicará aproximadamente.
Precios
Cuando exportas datos en una consulta estándar, se te factura según los precios de extracción de datos.
Cuando exportas datos en una consulta continua, se te factura según los precios de computación de capacidad de BigQuery.
Para ejecutar consultas continuas, debes tener una reserva que use la edición Enterprise o Enterprise Plus y una asignación de reserva que use el tipo de trabajo CONTINUOUS
.
Una vez que se hayan exportado los datos, se te cobrará por almacenarlos en Bigtable. Para obtener más información, consulta los precios de Bigtable.