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:

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

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ón us-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ón asia-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 valor NULL 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 tipo STRUCT o JSON, se eliminan todos los valores de la columna que pertenezcan a la familia de columnas correspondiente de la fila afectada. Debe convertir el valor NULL al tipo STRUCT o JSON para que el motor de SQL le asigne el tipo correcto. La siguiente consulta elimina todos los datos de la familia de columnas column_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 tipo STRING o BYTES.
  • 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.