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:

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

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ón us-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ón asia-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 valor NULL 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 tipo STRUCT o JSON, se borran todos los valores de columna que pertenecen a la familia de columnas correspondiente de la fila afectada. Debes transmitir el valor NULL al tipo STRUCT o JSON para que el motor SQL le adjunte un tipo correcto. La siguiente consulta borra todos los datos de la familia de columnas column_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 tipo STRING o BYTES.
  • 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.