Exporta datos a Bigtable (ETL inverso)
En este documento, se describe cómo configurar ETL inverso (RETL) desde BigQuery a Bigtable. Puedes hacerlo mediante la declaración 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 capacidades de estadísticas de BigQuery con la latencia baja y la capacidad de procesamiento alta de Bigtable. Este flujo de trabajo te permite entregar datos a los usuarios de la aplicación sin agotar cuotas y límites en BigQuery.
Características de las tablas de Bigtable
Las tablas de Bigtable son diferentes de las tablas de BigQuery de varias maneras:
- Las tablas de Bigtable y BigQuery están compuestas por filas, pero una fila de Bigtable está compuesta por una clave de fila y familias de columnas que tienen una cantidad arbitraria de columnas que pertenecen a la misma familia de columnas.
- Las familias de columnas de una tabla determinada se crean en el momento de su creación, pero también se pueden agregar o quitar más adelante. Cuando se crea una familia de columnas, no es necesario especificar las columnas que le pertenecen.
- Las columnas de Bigtable no necesitan definirse con anticipació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 dentro de las tablas.
- Las columnas de Bigtable pueden tener cualquier valor binario dentro de los límites de tamaño de los datos dentro de las tablas.
- Las columnas de Bigtable siempre tienen una dimensión temporal (también conocida como versión). Se puede almacenar cualquier cantidad de valores en cualquier fila de la misma columna, siempre que la marca de tiempo no sea idéntica.
- Una marca de tiempo de Bigtable se mide en microsegundos desde el tiempo Unix, por ejemplo, 0 representa 1970-01-01T00:00:00 UTC. Las marcas de tiempo deben ser un número no negativo de microsegundos con un nivel de detalle de milisegundos (solo se aceptan múltiplos de 1,000 us). La marca de tiempo predeterminada de Bigtable es 0.
- Los datos de Bigtable se leen por clave de fila, varias claves de fila, un rango de claves de fila o con un filtro. Se requiere al menos una clave de fila o un rango de claves de fila en todos los tipos de solicitudes de lectura, excepto para un análisis completo de la tabla.
Para obtener información sobre cómo preparar los resultados de BigQuery para exportarlos a Bigtable, consulta Cómo preparar los resultados de las consultas para exportarlos.
Antes de comenzar
Debes crear una instancia de Bigtable y una tabla de Bigtable 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.
Roles obligatorios
Para obtener los permisos que necesitas para exportar los datos de BigQuery a Bigtable, 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 exportación: Usuario de BigQuery (
roles/bigquery.user
) - Escribir datos en una tabla de Bigtable: Usuario de Bigtable (
roles/bigtable.user
)
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
- La codificación se limita a solo
BINARY
yTEXT
. - El perfil de app de Bigtable de destino se debe configurar con el enrutamiento de un solo clúster y un nivel de prioridad de solicitud bajo.
- El perfil de la app de Bigtable debe configurarse para enrutar los datos a un clúster de Bigtable ubicado con el conjunto de datos de BigQuery. Para obtener más información, consulta Consideraciones sobre la ubicación.
- Las exportaciones a Bigtable solo son compatibles con las ediciones BigQuery Enterprise o Enterprise Plus. No se admiten la edición Standard de BigQuery ni el procesamiento on demand.
- Las exportaciones a Bigtable solo son compatibles con las reservas que tienen una asignación de
QUERY
.
Consideraciones de ubicación
- Si tu conjunto de datos de BigQuery está en una multirregión, tu perfil de app 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 multirregión
US
, el clúster de Bigtable puede estar ubicado en la regiónus-west1
(Oregón), que se encuentra en Estados Unidos. - Si tu conjunto de datos de BigQuery está en una sola región, tu perfil de app 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 compatibles
Los siguientes tipos de datos son compatibles cuando se escriben en Bigtable:
Tipo de BigQuery | Valor de Bigtable escrito |
---|---|
BYTES |
Se exporta tal como está. |
STRING |
Se convierte en BYTES |
INTEGER |
Si bigtable_options.column_families.encoding se configura como BINARY , el valor se escribe en un formato big-endian de 8 bytes (el byte más significativo primero). Si bigtable_options.column_families.encoding se configura como TEXT , el valor se escribe como una string 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 configura como BINARY , el valor se escribe como un valor de 1 byte (false = 0x00 o true = 0x01). Si bigtable_options.column_families.encoding se configura 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 específica de Bigtable. Los miembros del objeto JSON se interpretan como columnas y sus valores se deben escribir en Bigtable. El nombre de la columna que se escribirá se puede ajustar con la configuración de bigtable_options . Por ejemplo:
JSON '{"FIELD1": "VALUE1", "FIELD2": "VALUE2"}' as MY_COLUMN_FAMILY En el que 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 específica de Bigtable. Los miembros del struct se interpretan como columnas y sus valores se deben escribir en Bigtable. El nombre de la columna que se escribirá se puede ajustar con la configuración de bigtable_options . Por ejemplo:
STRUCT<FIELD1 STRING, FIELD2 INTEGER> as MY_COLUMN_FAMILY En el que 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 compatibles son similares a la lectura de tablas externas de Bigtable para BigQuery.
Valores de NULL
en Bigtable
Los valores de NULL
en Bigtable tienen las siguientes restricciones:
Bigtable no tiene un análogo para los valores
NULL
. Si exportas un valorNULL
para una familia de columnas y una columna de Bigtable, se borran los valores actuales de una fila de Bigtable.Si un valor de Bigtable con una clave de fila, una familia de columnas, un calificador de columna y una marca de tiempo determinados no existe antes de la exportación, los valores de
NULL
exportados no tienen ningún efecto en la fila de Bigtable.Cuando se exporta un valor
NULL
de tipoSTRUCT
oJSON
, se borran todos los valores de columna que pertenecen a la familia de columnas correspondiente de la fila afectada. Debes transmitir el valorNULL
al tipoSTRUCT
oJSON
para que el motor SQL le adjunte un tipo correcto. La siguiente consulta borra todos los datos de la familia de columnascolumn_family1
con un conjunto de claves de fila determinadas:EXPORT DATA OPTIONS (...) AS SELECT rowkey, CAST(NULL as STRUCT<INT64>) AS column_family1 FROM T
Las filas con claves de fila
NULL
se omiten durante la exportación. La cantidad de filas omitidas se muestra en las estadísticas de exportación al llamador.
Configura exportaciones con bigtable_options
Puedes usar la configuración de bigtable_options
durante una exportación para cerrar la brecha entre los modelos de almacenamiento de BigQuery y Bigtable. La configuración se expresa en forma de una cadena JSON, como se ve 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 posibles que se usan en una configuración de bigtable_options
:
Nombre del campo | Descripción |
---|---|
columnFamilies |
Un array de descriptores de familias de columnas. |
columnFamilies.familyId |
Identificador de la familia de columnas de Bigtable. |
columnFamilies.encoding |
El valor se puede establecer en BINARY o TEXT . Si deseas obtener más información sobre cómo se codifican los tipos, consulta Tipos de BigQuery compatibles. |
columnFamilies.columns |
Un array 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 son mutuamente excluyentes. Si no se especifican qualifierString ni qualifierEncoded , se usa fieldName como calificador de columna. |
columnFamilies.columns.qualifierEncoded |
Opcional: Cualificador de columna codificado en base64. Es similar a qualifierString en caso de que el calificador de columna deba tener códigos que no sean UTF-8. |
columnFamilies.columns.fieldName |
Obligatorio: Es el 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 Cómo preparar los resultados de la consulta para exportarlos. |
Prepara los resultados de la consulta para exportarlos
Para exportar los resultados de las consultas a Bigtable, estos deben cumplir con los siguientes requisitos:
- El conjunto de resultados debe contener una columna
rowkey
del tipoSTRING
oBYTES
. - Las claves de fila, los calificadores de columna, los valores y las marcas de tiempo no deben exceder los límites de tamaño de los datos dentro de las tablas de Bigtable.
- Debe haber al menos una columna que no sea
rowkey
en el conjunto de resultados. - Cada columna del conjunto de resultados debe ser de uno de los tipos de BigQuery compatibles. Los tipos de columnas no compatibles deben convertirse en uno de los tipos compatibles antes de exportar a Bigtable.
Bigtable no requiere que los calificadores de columna sean nombres de columna válidos de BigQuery, y Bigtable admite el uso de bytes. Si deseas obtener información sobre cómo anular los calificadores de columna de destino para una exportación, consulta Configura exportaciones con bigtable_options
.
Si usas valores exportados con las APIs de Bigtable, como ReadModifyWriteRow
, cualquier valor numérico debe usar la codificación binaria correcta.
De forma predeterminada, las columnas de resultados independientes de tipos distintos de STRUCT
o JSON
se interpretan como los valores para las familias de columnas de destino igual al nombre de la columna de resultados, y el calificador de columnas igual a una string vacía.
Para demostrar cómo se escriben estos tipos de datos, considera el siguiente ejemplo de SQL, en el que 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 el calificador de columna ''
(string vacía) cuando se manejan tipos distintos de JSON
o STRUCT
.
Puedes cambiar la forma en que se escriben estos tipos en una exportación con la configuración de bigtable_options
, como se ve 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 T
de BigQuery 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
, los siguientes datos se escriben en Bigtable:
rowkey |
sales_info (familia de columnas) |
ordered_at (familia de columnas) |
|||
---|---|---|---|---|---|
101 | producto | importe | 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 tiempo Unix en la zona horaria de UTC.
Establece marcas de tiempo para todas las celdas de una fila con _CHANGE_TIMESTAMP
Puedes agregar una columna _CHANGE_TIMESTAMP
del tipo TIMESTAMP
al resultado para exportarlo.
Cada celda escrita en Bigtable usa el valor de marca de tiempo de _CHANGE_TIMESTAMP
de la fila de resultado exportada.
Bigtable no admite marcas de tiempo anteriores al tiempo Unix (1970-01-01T00:00:00Z). Si el valor de _CHANGE_TIMESTAMP
es NULL
, el tiempo Unix de 0
se usa como el valor de marca de tiempo predeterminado.
En la siguiente consulta, se escriben celdas para 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
Exporta continuamente
Si deseas procesar una consulta de exportación de forma continua, puedes configurarla como una consulta continua.
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 Bigtable terminan en la misma fila de Bigtable.
Puedes usar este método para generar varias versiones de los valores de las columnas en la misma fila. En este ejemplo, la tabla orders
en 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 |
Luego, el usuario ejecuta la siguiente sentencia 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
El uso de esta sentencia con la tabla orders
de BigQuery da como resultado los siguientes datos escritos 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 |
La exportación a Bigtable combina valores nuevos en la tabla en lugar de reemplazar filas completas. Si los valores ya están presentes en Bigtable para una clave de fila, los valores nuevos pueden anular los valores anteriores de forma parcial o total, según la familia de columnas, los nombres de las columnas y las marcas de tiempo de las celdas que se escriben.
Exporta varias columnas como valores de Protocol Buffer (Protobuf)
Los búferes de protocolo proporcionan un mecanismo flexible y eficiente para serializar datos estructurados. Exportar como Protobuf puede ser beneficioso si se considera cómo se manejan los diferentes tipos entre BigQuery y Bigtable. Puedes usar funciones definidas por el usuario (UDF) de BigQuery para exportar datos como valores binarios de Protobuf a Bigtable. Para obtener más información, consulta Exporta datos como columnas de Protobuf.
Optimización de exportaciones
Puedes cambiar la capacidad de procesamiento con la que se exportan los registros de BigQuery a Bigtable modificando la cantidad de nodos en el clúster de destino de Bigtable. La capacidad de procesamiento (filas escritas por segundo) se escala de forma lineal con la cantidad de nodos en el clúster de destino. Por ejemplo, si duplicas la cantidad de nodos en el clúster de destino, la capacidad de procesamiento de exportación será aproximadamente el doble.
Precios
Cuando exportas datos en una consulta estándar, se te factura mediante los precios de extracción de datos.
Cuando exportas datos en una consulta continua, se te factura a través los precios de procesamiento 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 usa el tipo de trabajo CONTINUOUS
.
Una vez que se exportan los datos, se te cobra por almacenarlos en Bigtable. Para obtener más información, consulta los precios de Bigtable.