Crea tablas externas de solo lectura de Apache Iceberg

Las tablas externas de Apache Iceberg de solo lectura te permiten acceder a las tablas de Apache Iceberg con un control de acceso más detallado en un formato de solo lectura. Esta capacidad contrasta con las tablas de BigLake para Apache Iceberg en BigQuery, que te permiten crear tablas de 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 solo lectura de Apache Iceberg (en adelante, tablas de solo lectura de Iceberg) admiten la versión 2 de la especificación de Iceberg, incluida la combinación en 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.

Puedes crear tablas de Iceberg de solo lectura de las siguientes maneras:

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

  • Con AWS Glue Data Catalog (recomendado para AWS). AWS Glue es el método recomendado para AWS porque 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 capacidades como el descubrimiento automático de esquemas y la integración con las 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 de solo lectura que hagan referencia a un archivo de metadatos de Iceberg.

Para obtener una lista completa de limitaciones, consulta Limitaciones.

Antes de comenzar

Roles obligatorios

Para obtener los permisos que necesitas para crear una tabla de Iceberg de solo lectura, 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 Iceberg de solo lectura. 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 Iceberg de solo lectura:

  • 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 BigLake Metastore

Te recomendamos que crees tablas de Iceberg de solo lectura con BigLake Metastore. 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 Crea y ejecuta un procedimiento almacenado.

Crea tablas con un archivo de metadatos

Puedes crear tablas de Iceberg de solo lectura 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 solo lectura de Iceberg. 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 Iceberg de solo lectura 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 Iceberg de solo lectura, por ejemplo, myproject

  • CONNECTION_REGION: la región que contiene la conexión para crear la tabla de solo lectura de Iceberg, 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 Iceberg de solo lectura, 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 controlar el acceso a las tablas de solo lectura de Iceberg a través de la seguridad a nivel de columna, la seguridad a nivel de fila y el enmascaramiento de datos.

Consulta tablas de Iceberg de solo lectura

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 de solo lectura tienen limitaciones de tablas externas y las siguientes limitaciones:

  • Las tablas que usan la combinación en 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.
    • Puedes evitar estas limitaciones compactando los archivos de eliminación con frecuencia o creando una vista sobre la tabla de Iceberg que evite las particiones que se mutan con frecuencia.
  • 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 Iceberg de solo lectura deben contener literales en predicados en comparación con las columnas particionadas.

  • Solo se admiten archivos de datos de Apache Parquet.

Costos de la combinación en la lectura

La facturación a pedido de los datos de combinación en 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 las borradas por igualdad).
  • Son los bytes lógicos leídos al cargar los archivos de eliminación por igualdad y eliminación por 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 Iceberg de solo lectura llamada TABLE con el 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 Iceberg de solo lectura 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 Iceberg de solo lectura, por ejemplo, myproject

  • CONNECTION_REGION: la región que contiene la conexión para crear la tabla de Iceberg de solo lectura. 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?