Crea tablas externas de BigLake para Apache Iceberg

Las tablas externas de BigLake te permiten acceder a las tablas de Apache Iceberg con un control de acceso más detallado en formato de solo lectura. Esta función es diferente a las tablas de BigQuery para Apache Iceberg, que te permiten crear tablas de Apache Iceberg en BigQuery en un formato de escritura.

Iceberg es un formato de tabla de código abierto que admite tablas de datos a escala de petabytes. La especificación abierta de Iceberg te permite ejecutar varios motores de búsqueda en una sola copia de los datos almacenados en un almacén de objetos. Las tablas externas de BigLake para Apache Iceberg (en adelante, llamadas tablas de BigLake Iceberg) admiten la versión 2 de la especificación de Iceberg, incluida la combinación durante la lectura.

Como administrador de BigQuery, puedes aplicar un control de acceso a nivel de fila y columna, incluido el enmascaramiento de datos en tablas. Para obtener información sobre cómo configurar el control de acceso a nivel de tabla, consulta Configura las políticas de control de acceso. Las políticas de acceso a las tablas también se aplican cuando usas la API de BigQuery Storage como fuente de datos para la tabla en Dataproc y Spark sin servidores. Las tablas de BigLake proporcionan integraciones adicionales con otros servicios de BigQuery. Para obtener una lista completa de las integraciones disponibles, consulta Introducción a las tablas de BigLake.

Puedes crear tablas de Iceberg BigLake de las siguientes maneras:

  • Con BigQuery Metastore (recomendado para Google Cloud). BigQuery Metastore se basa en el catálogo de BigQuery y se integra directamente en BigQuery. Las tablas de BigQuery Metastore son mutables desde varios motores de código abierto, y se pueden consultar las mismas tablas desde BigQuery. BigQuery Metastore también admite integración directa con Apache Spark.

  • Con AWS Glue Data Catalog (recomendado para AWS). AWS Glue es el método recomendado para AWS, ya que es un repositorio de metadatos centralizado en el que Defines la estructura y la ubicación de tus datos almacenados en varios servicios de AWS y proporciona funciones como el descubrimiento automático de esquemas y la integración con herramientas de análisis de AWS.

  • Con archivos de metadatos JSON de Iceberg (recomendado para Azure). Si usas un archivo de metadatos JSON de Iceberg, debes actualizar de forma manual el archivo de metadatos más reciente cada vez que haya alguna actualización de la tabla. Puedes usar un procedimiento almacenado de BigQuery para Apache Spark a fin de crear tablas de Iceberg Biglake que hagan referencia a un archivo de metadatos de Iceberg.

    Para obtener una lista completa de limitaciones, consulta Limitaciones.

A continuación, se comparan las tablas de BigLake Iceberg con otras variedades de tablas similares en BigQuery:

Tablas estándar de BigQuery Tablas externas de BigLake Tablas externas de BigLake para Apache Iceberg (también conocidas como tablas de BigLake Iceberg) Tablas de Iceberg del metastore de BigQuery (versión preliminar) Tablas de BigQuery para Apache Iceberg (también conocidas como tablas administradas de Iceberg o tablas de BigQuery Iceberg) (versión preliminar)
Funciones clave Experiencia completamente administrada Están regulados (control de acceso detallado) y son funcionales en motores de código abierto y de BigQuery. Funciones de tablas externas de BigLake y coherencia de los datos, actualizaciones de esquemas No se puede crear desde Spark ni otros motores abiertos. Funciones de la tabla de BigLake Iceberg y mutabilidad desde motores externos. No se pueden crear con DDL ni la herramienta de línea de comandos de bq. Funciones de la tabla de BigLake Iceberg y baja sobrecarga administrativa con datos y metadatos abiertos
Almacenamiento de datos Almacenamiento administrado de BigQuery Datos de formato abierto alojados en buckets administrados por el usuario
Modelo abierto API de lectura de BigQuery Storage (a través de conectores) Formatos de archivo abiertos (Parquet) Bibliotecas abiertas (Iceberg) Compatible con código abierto (instantáneas de metadatos de Iceberg)
Administración Administración unificada de BigQuery
Escrituras (DML y transmisión) A través de conectores, APIs, DML de alta productividad y CDC de BigQuery Solo escribe a través de motores externos A través de conectores, APIs, DML de alta productividad y CDC de BigQuery

Antes de comenzar

Roles obligatorios

Para obtener los permisos que necesitas para crear una tabla de BigLake, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para crear una tabla de BigLake. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para crear una tabla de BigLake:

  • bigquery.tables.create
  • bigquery.connections.delegate
  • bigquery.jobs.create

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Crea tablas con el metastore de BigQuery

Te recomendamos crear tablas de Iceberg BigLake con el metastore de BigQuery. Puedes usar Apache Spark para crear estas tablas. Una forma conveniente de hacerlo es usar los procedimientos almacenados de BigQuery. Para ver un ejemplo, consulta Cómo crear y ejecutar un procedimiento almacenado.

Crea tablas con un archivo de metadatos

Puedes crear tablas de BigLake Iceberg con un archivo de metadatos JSON. Sin embargo, este no es el método recomendado porque tienes que actualizar el URI del archivo de metadatos JSON de forma manual para mantener actualizada la tabla de BigLake. Si el URI no se mantiene actualizado, las consultas en BigQuery pueden fallar o proporcionar resultados diferentes de otros motores de consulta que usan directamente un catálogo de Iceberg.

Los archivos de metadatos de tablas de Iceberg se crean en el bucket de Cloud Storage que especificas cuando creas una tabla de Iceberg mediante Spark.

Selecciona una de las opciones siguientes:

SQL

Usa la sentencia CREATE EXTERNAL TABLE: En el siguiente ejemplo, se crea una tabla de BigLake llamada myexternal-table:

  CREATE EXTERNAL TABLE myexternal-table
  WITH CONNECTION `myproject.us.myconnection`
  OPTIONS (
         format = 'ICEBERG',
         uris = ["gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json"]
   )

Reemplaza el valor uris por el archivo de metadatos JSON más reciente para una instantánea de tabla específica.

Puedes habilitar requerir filtro de partición si configuras la marca require_partition_filter.

bq

En un entorno de línea de comandos, usa el comando bq mk --table con el decorador @connection para especificar la conexión que se usará al final del parámetro --external_table_definition. Para habilitar la opción de requerir filtro de partición, usa --require_partition_filter.

bq mk 
--table
--external_table_definition=TABLE_FORMAT=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID
PROJECT_ID:DATASET.EXTERNAL_TABLE

Reemplaza lo siguiente:

  • TABLE_FORMAT: el formato de la tabla que deseas crear

    En este caso: ICEBERG.

  • URI: el archivo de metadatos JSON más reciente para una instantánea de tabla específica.

    Por ejemplo, gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json.

    El URI también puede apuntar a una ubicación de nube externa; como Amazon S3 o Azure Blob Storage.

    • Ejemplo para AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Ejemplo para Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
  • CONNECTION_PROJECT_ID: el proyecto que contiene la conexión para crear la tabla de BigLake, por ejemplo, myproject

  • CONNECTION_REGION: la región que contiene la conexión para crear la tabla de BigLake, por ejemplo, us

  • CONNECTION_ID: el ID de conexión de la tabla, por ejemplo, myconnection.

    Cuando ves los detalles de conexión en la consola de Google Cloud, el ID de conexión es el valor en la última sección del ID de conexión completamente calificado que se muestra en ID de conexión, por ejemplo projects/myproject/locations/connection_location/connections/myconnection.

  • DATASET: el nombre del conjunto de datos de BigQuery en el que deseas crear una tabla

    Por ejemplo, mydataset.

  • EXTERNAL_TABLE: el nombre de la tabla que deseas crear

    Por ejemplo, mytable.

Actualizar metadatos de tablas

Si usas un archivo de metadatos JSON para crear una tabla de BigLake Iceberg, actualiza la definición de tabla con los metadatos más recientes de la tabla. Para actualizar el esquema o el archivo de metadatos, selecciona una de las siguientes opciones:

bq

  1. Crea un archivo de definición de tabla:

    bq mkdef --source_format=ICEBERG \
    "URI" > TABLE_DEFINITION_FILE
    
  2. Usa el comando bq update con la marca --autodetect_schema:

    bq update --autodetect_schema --external_table_definition=TABLE_DEFINITION_FILE
    PROJECT_ID:DATASET.TABLE
    

    Reemplaza lo siguiente:

    • URI: tu URI de Cloud Storage con el archivo de metadatos JSON más reciente

      Por ejemplo, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

    • TABLE_DEFINITION_FILE: el nombre del archivo que contiene el esquema de la tabla

    • PROJECT_ID: el ID del proyecto que contiene la tabla que deseas actualizar

    • DATASET: el conjunto de datos que contiene la tabla que deseas actualizar

    • TABLE: la tabla que deseas actualizar

API

Usa el método tables.patch con la propiedad autodetect_schema establecida como true:

PATCH https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/TABLE?autodetect_schema=true

Reemplaza lo siguiente:

  • PROJECT_ID: el ID del proyecto que contiene la tabla que deseas actualizar
  • DATASET: el conjunto de datos que contiene la tabla que deseas actualizar
  • TABLE: la tabla que deseas actualizar

En el cuerpo de la solicitud, especifica los valores actualizados para los siguientes campos:

{
     "externalDataConfiguration": {
      "sourceFormat": "ICEBERG",
      "sourceUris": [
        "URI"
      ]
    },
    "schema": null
  }'

Reemplaza URI por el archivo de metadatos de Iceberg más reciente. Por ejemplo, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json

Configura las políticas de control de acceso

Puedes usar varios métodos para controlar el acceso a las tablas de BigLake:

Por ejemplo, supongamos que deseas limitar el acceso a las filas de la tabla mytable en el conjunto de datos mydataset:

+---------+---------+-------+
| country | product | price |
+---------+---------+-------+
| US      | phone   |   100 |
| JP      | tablet  |   300 |
| UK      | laptop  |   200 |
+---------+---------+-------+

Puedes crear un filtro a nivel de fila para Kim (kim@example.com) que restrinja su acceso a las filas en las que country es igual a US.

CREATE ROW ACCESS POLICY only_us_filter
ON mydataset.mytable
GRANT TO ('user:kim@example.com')
FILTER USING (country = 'US');

Luego, Kim ejecuta la siguiente consulta:

SELECT * FROM projectid.mydataset.mytable;

En el resultado, solo se muestran las filas en las que country es igual a US:

+---------+---------+-------+
| country | product | price |
+---------+---------+-------+
| US      | phone   |   100 |
+---------+---------+-------+

Consulta tablas de BigLake

Para obtener más información, visita Consulta datos de Iceberg.

Asignación de datos

BigQuery convierte los tipos de datos de Iceberg en tipos de datos de BigQuery, como se muestra en la siguiente tabla:

Tipo de datos Iceberg Tipo de datos de BigQuery
boolean BOOL
int INT64
long INT64
float FLOAT64
double FLOAT64
Decimal(P/S) NUMERIC or BIG_NUMERIC depending on precision
date DATE
time TIME
timestamp DATETIME
timestamptz TIMESTAMP
string STRING
uuid BYTES
fixed(L) BYTES
binary BYTES
list<Type> ARRAY<Type>
struct STRUCT
map<KeyType, ValueType> ARRAY<Struct<key KeyType, value ValueType>>

Limitaciones

Las tablas de Iceberg BigLake tienen limitaciones de tablas de BigLake y, también, las siguientes limitaciones:

  • Las tablas que usan la combinación durante la lectura tienen las siguientes limitaciones:

    • Cada archivo de datos se puede asociar con hasta 10,000 archivos de eliminación.
    • No se pueden aplicar más de 100,000 IDs de igualdad a un archivo de eliminación.
    • Para evitar estas limitaciones, puedes compactar los archivos borrados con frecuencia o crear una vista sobre la tabla Iceberg que evite las particiones con mutaciones frecuentes.
  • BigQuery admite la reducción de manifiestos mediante todas las funciones de transformación de partición de Iceberg, excepto Bucket. Para obtener información sobre cómo reducir las particiones, lee Consulta tablas particionadas. Las consultas que hacen referencia a las tablas de BigLake Iceberg deben contener literales en predicados en comparación con las columnas particionadas.

  • Solo se admiten archivos de datos de Apache Parquet.

Costos de combinación durante la lectura

La facturación a pedido de los datos de combinación durante la lectura es la suma de los análisis de los siguientes datos:

  • Todos los bytes lógicos leídos en el archivo de datos (incluidas las filas marcadas como borradas por posición y borrados de igualdad)
  • Bytes lógicos que leen la carga de eliminación de igualdad y los archivos de eliminación de posición para encontrar las filas borradas en un archivo de datos.

Exigir filtro de partición

Puedes exigir el uso de filtros de predicado si habilitas la opción Requerir filtro de partición para tu tabla de Iceberg. Si habilitas esta opción, los intentos de consultar la tabla sin especificar una cláusula WHERE que se alinee con cada archivo de manifiesto producirán el siguiente error:

Cannot query over table project_id.dataset.table without a
filter that can be used for partition elimination.

Cada archivo de manifiesto requiere al menos un predicado adecuado para eliminar particiones.

Puedes habilitar require_partition_filter de las siguientes maneras mientras creas una tabla de Iceberg:

SQL

Usa la sentencia CREATE EXTERNAL TABLE. En el siguiente ejemplo, se crea una tabla de BigLake llamada TABLE con requerir filtro de partición habilitado:

  CREATE EXTERNAL TABLE TABLE
  WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
  OPTIONS (
         format = 'ICEBERG',
         uris = [URI],
         require_partition_filter = true
   )

Reemplaza lo siguiente:

  • TABLE: el nombre de la tabla que deseas crear.
  • PROJECT_ID: el ID del proyecto que contiene la tabla que deseas crear.
  • REGION: la ubicación en la que deseas crear la tabla de Iceberg.
  • CONNECTION_ID: el ID de conexión. Por ejemplo, myconnection.

  • URI: el URI de Cloud Storage con el archivo de metadatos JSON más reciente.

    Por ejemplo, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

    El URI también puede apuntar a una ubicación de nube externa; como Amazon S3 o Azure Blob Storage.

    • Ejemplo para AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Ejemplo para Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.

bq

Usa el comando bq mk --table con el decorador @connection para especificar la conexión que se usará al final del parámetro --external_table_definition. Usa --require_partition_filter para habilitar el filtro de requerir partición. En el siguiente ejemplo, se crea una tabla de BigLake llamada TABLE con el filtro de partición habilitado:

bq mk \
    --table \
    --external_table_definition=ICEBERG=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID \
    PROJECT_ID:DATASET.EXTERNAL_TABLE \
    --require_partition_filter

Reemplaza lo siguiente:

  • URI: el archivo de metadatos JSON más reciente para una instantánea de tabla específica

    Por ejemplo, gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json.

    El URI también puede apuntar a una ubicación de nube externa; como Amazon S3 o Azure Blob Storage.

    • Ejemplo para AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Ejemplo para Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
  • CONNECTION_PROJECT_ID: el proyecto que contiene la conexión para crear la tabla de BigLake, por ejemplo, myproject

  • CONNECTION_REGION: la región que contiene la conexión para crear la tabla de BigLake. Por ejemplo, us.

  • CONNECTION_ID: el ID de conexión. Por ejemplo, myconnection.

    Cuando ves los detalles de conexión en la consola de Google Cloud, el ID de conexión es el valor en la última sección del ID de conexión completamente calificado que se muestra en ID de conexión, por ejemplo projects/myproject/locations/connection_location/connections/myconnection.

  • DATASET: el nombre del conjunto de datos de BigQuery

    que contiene la tabla que deseas actualizar. Por ejemplo, mydataset.

  • EXTERNAL_TABLE: el nombre de la tabla que deseas crear

    Por ejemplo, mytable.

También puedes actualizar tu tabla de Iceberg para habilitar el filtro de partición requerida.

Si no habilitas la opción exigir filtro de partición cuando creas la tabla particionada, puedes actualizar la tabla para agregar la opción.

bq

Usa el comando bq update y proporciona la marca --require_partition_filter.

Por ejemplo:

Para actualizar mypartitionedtable en mydataset en tu proyecto predeterminado, ingresa el siguiente código:

bq update --require_partition_filter PROJECT_ID:DATASET.TABLE

¿Qué sigue?