Tablas de BigQuery para Apache Iceberg

Para obtener asistencia durante la vista previa, envía un correo electrónico a bigquery-tables-for-apache-iceberg-help@google.com.

Las tablas de BigQuery para Apache Iceberg (en adelante, tablas de Iceberg) proporcionan la base para compilar lakehouses de formato abierto en Google Cloud. Las tablas de Iceberg ofrecen la misma experiencia completamente administrada que las tablas de BigQuery, pero almacenan datos en buckets de almacenamiento que pertenecen al cliente con Parquet para ser interoperables con los formatos de tablas abiertas de Iceberg.

Las tablas de BigQuery para Apache Iceberg son diferentes de las tablas externas de BigLake para Apache Iceberg porque solo las tablas de BigQuery para Apache Iceberg se pueden modificar directamente en BigQuery. Las tablas externas de BigLake para Apache Iceberg son tablas de solo lectura generadas a partir de otro motor de consulta, como Apache Spark, y solo se pueden consultar con BigQuery.

Las tablas de Iceberg admiten las siguientes funciones:

Arquitectura

Las tablas Iceberg brindan la comodidad de la administración de recursos de BigQuery a las tablas que residen en tus propios buckets de nube. Las tablas de Iceberg te permiten usar BigQuery en estas tablas sin mover los datos fuera de los buckets que controlas.

En el siguiente diagrama, se muestra la arquitectura de las tablas administradas en un nivel alto: Diagrama de la arquitectura de las tablas de BigQuery para Iceberg.

Esta administración de tablas tiene las siguientes implicaciones en tu bucket:

  • BigQuery crea archivos de datos nuevos en el bucket en respuesta a solicitudes de escritura y optimizaciones de almacenamiento en segundo plano, como instrucciones DML y transmisión.
  • Cuando borras una tabla administrada en BigQuery, BigQuery no borra los archivos de datos asociados. Para confirmar la eliminación, debes borrar los archivos y los metadatos de las tablas exportadas del bucket de forma manual.
  • Las tablas Iceberg no generan costos de almacenamiento de BigQuery. Para obtener más información, consulta Facturación.

Crear una tabla de Iceberg es similar a crear tablas de BigQuery. Debido a que almacena datos en formatos abiertos en Cloud Storage, tiene más opciones para lo siguiente:

  • Especifica la conexión de recursos de Cloud con WITH CONNECTION para configurar las credenciales de conexión de BigLake y acceder a Cloud Storage.
  • Especifica el formato de archivo del almacenamiento de datos con file_format. PARQUET es compatible con la vista previa.
  • Especifica el formato de tabla de metadatos de código abierto con table_format. ICEBERG es compatible con la vista previa.

Prácticas recomendadas

Si cambias o agregas archivos directamente al bucket fuera de BigQuery, se pueden perder datos o producirse errores irrecuperables. En la siguiente tabla, se describen las situaciones posibles:

Operación Consecuencias Prevención
Agregar archivos nuevos al bucket fuera de BigQuery. Pérdida de datos: BigQuery no realiza un seguimiento de los archivos u objetos nuevos que se agregan fuera de BigQuery. Los procesos de recolección de elementos no utilizados en segundo plano borran los archivos sin seguimiento. Agregar datos exclusivamente a través de BigQuery. Esto permite que BigQuery haga un seguimiento de los archivos y evite que se recopilen como basura.
Para evitar la pérdida de datos y las incorporaciones accidentales, también te recomendamos restringir los permisos de escritura de herramientas externas en los buckets que contienen tablas Iceberg.
Crea una nueva tabla de Iceberg en un prefijo no vacío. Pérdida de datos: BigQuery no realiza un seguimiento de los datos existentes, por lo que estos archivos se consideran sin seguimiento y se borran con los procesos de recolección de elementos no utilizados en segundo plano. Solo crea tablas de Iceberg nuevas en prefijos vacíos.
Modifica o reemplaza los archivos de datos de tablas de Iceberg. Pérdida de datos: En la modificación o el reemplazo externos, la tabla no pasa una verificación de coherencia y se vuelve ilegible. Las consultas a la tabla fallan.
No hay una forma de autoservicio para recuperarse de este punto. Comunícate con el equipo de asistencia para obtener ayuda con la recuperación de datos.
Modificar los datos exclusivamente a través de BigQuery. Esto permite que BigQuery haga un seguimiento de los archivos y evite que se recopilen como basura.
Para evitar la pérdida de datos y las incorporaciones accidentales, también te recomendamos restringir los permisos de escritura de herramientas externas en los buckets que contienen tablas Iceberg.
Crear dos tablas de BigQuery para Apache Iceberg en los mismos URIs o en URIs superpuestos. Pérdida de datos: BigQuery no establece una vinculación entre instancias de URI idénticas de tablas de Iceberg. Los procesos de recolección de elementos no utilizados en segundo plano de cada tabla considerarán que los archivos de la tabla opuesta no tienen seguimiento y los borrarán, lo que provocará la pérdida de datos. Usa URIs únicos para cada tabla de Iceberg.

Consideración de la ubicación

Puedes mejorar el rendimiento mediante buckets de Cloud Storage en una región única o en una región doble en lugar de buckets multirregionales.

Facturación

Las siguientes funciones se cobran con los precios publicados existentes:

  • Precios de Cloud Storage para todos los datos almacenados en los buckets de Cloud Storage, el procesamiento de datos que realiza Cloud Storage y el uso de red para la cantidad de datos que se leen de tu bucket.
  • Precios de procesamiento de BigQuery para consultas, DML y optimización del almacenamiento en segundo plano (incluidos el agrupamiento, la coalescencia y la recolección de elementos no utilizados).
    • Los cargos que se realizan con reservas (ranuras) siguen los precios de las ranuras existentes.
    • Los cargos que usan las unidades de mantenimiento de acciones (SKU) según demanda siguen los precios según demanda existentes. Para obtener más información, consulta Costos de BigLake.
  • El procesamiento de carga masiva y extracción se cobra con SKUs on demand o reservas (espacios).
  • Precios de la API de Storage Read para leer desde Spark a través de la API de Read.
  • Precios de la API de Storage Write para la transmisión.

Flujos de trabajo de tablas de Iceberg

En las siguientes secciones, se describe cómo crear, cargar, administrar y consultar tablas administradas.

Antes de comenzar

Antes de crear y usar tablas de Iceberg, asegúrate de haber configurado una conexión de recursos de Cloud a un bucket de almacenamiento. Tu conexión necesita permisos de escritura en el bucket de almacenamiento, como se especifica en la siguiente sección Roles obligatorios.

Roles obligatorios

Para obtener los permisos que necesitas para permitir que BigQuery administre las tablas de tu proyecto, pídele a tu administrador que te otorgue los siguientes roles de IAM:

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 permitir que BigQuery administre las tablas de tu proyecto. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para permitir que BigQuery administre las tablas de tu proyecto:

  • bigquery.connections.delegate en tu proyecto
  • bigquery.jobs.create en tu proyecto
  • bigquery.readsessions.create en tu proyecto
  • bigquery.tables.create en tu proyecto
  • bigquery.tables.get en tu proyecto
  • bigquery.tables.getData en tu proyecto
  • storage.buckets.get en tu proyecto
  • storage.objects.create en tu proyecto
  • storage.objects.delete en tu proyecto
  • storage.objects.get en tu proyecto
  • storage.objects.list en tu proyecto

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

Crea tablas de Iceberg

Para crear una tabla de Iceberg, selecciona uno de los siguientes métodos:

SQL

CREATE TABLE [PROJECT_NAME.]DATASET_NAME.TABLE_NAME (
COLUMN DATA_TYPE[, ...]
)
CLUSTER BY CLUSTER_COLUMN_LIST
WITH CONNECTION CONNECTION_NAME
OPTIONS (
file_format = 'PARQUET',
table_format = 'ICEBERG',
storage_uri = 'STORAGE_URI');

Reemplaza lo siguiente:

  • PROJECT_NAME: Es el proyecto que contiene el conjunto de datos. Si no se define, el comando supone el proyecto predeterminado.
  • DATASET_NAME: Es un conjunto de datos existente.
  • TABLE_NAME: es el nombre de la tabla que crearás.
  • DATA_TYPE: Es el tipo de datos de la información que se contiene en la columna.
  • CLUSTER_COLUMN_LIST: Es una lista separada por comas que contiene hasta cuatro columnas. Deben ser columnas de nivel superior que no se repitan.
  • CONNECTION_NAME: Es el nombre de la conexión. Por ejemplo, myproject.us.myconnection.
  • STORAGE_URI: Es un URI de Cloud Storage completamente calificado. Por ejemplo, gs://mybucket/table.

bq

bq --project_id=PROJECT_NAME mk \
    --file_format=PARQUET \
    --table_format=ICEBERG \
    --connection_id=CONNECTION_NAME \
    --storage_uri=STORAGE_URI \
    --schema=COLUMN_NAME:DATA_TYPE[, ...] \
    --clustering_fields=CLUSTER_COLUMN_LIST \
    MANAGED_TABLE_NAME

Reemplaza lo siguiente:

  • PROJECT_NAME: Es el proyecto que contiene el conjunto de datos. Si no se define, el comando supone el proyecto predeterminado.
  • CONNECTION_NAME: Es el nombre de la conexión. Por ejemplo, myproject.us.myconnection.
  • STORAGE_URI: Es un URI de Cloud Storage completamente calificado. Por ejemplo, gs://mybucket/table.
  • COLUMN_NAME: El nombre de la columna.
  • DATA_TYPE: Es el tipo de datos de la información que se incluye en la columna.
  • CLUSTER_COLUMN_LIST: Es una lista separada por comas que contiene hasta cuatro columnas. Deben ser columnas de nivel superior que no se repitan.
  • MANAGED_TABLE_NAME: es el nombre de la tabla que crearás.

API

Llama al método tables.insert con un recurso de tabla definido, similar al siguiente:

{
"tableReference": {
  "tableId": "TABLE_NAME"
},
"biglakeConfiguration": {
  "connectionId": "CONNECTION_NAME",
  "fileFormat": "PARQUET",
  "tableFormat": "ICEBERG",
  "storageUri": "STORAGE_URI"
},
"schema": {
  "fields": [
    {
      "name": "COLUMN_NAME",
      "type": "DATA_TYPE"
    }
    [, ...]
  ]
}
}

Reemplaza lo siguiente:

  • TABLE_NAME: Es el nombre de la tabla que crearás.
  • CONNECTION_NAME: Es el nombre de la conexión. Por ejemplo, myproject.us.myconnection.
  • STORAGE_URI: Es un URI de Cloud Storage completamente calificado. También se admiten comodines. Por ejemplo, gs://mybucket/table
  • COLUMN_NAME: El nombre de la columna.
  • DATA_TYPE: Es el tipo de datos de la información que se incluye en la columna.

Importa datos a la tabla Iceberg

En las siguientes secciones, se describe cómo importar datos de varios formatos de tablas a tablas de Iceberg.

Carga rápida desde archivos Parquet

La opción copy_files_only te permite cargar datos más rápido copiando tus archivos Parquet existentes, en lugar de leer el contenido y volver a escribirlo como archivos nuevos. La carga rápida usa menos capacidad de procesamiento en comparación con una carga de archivos normal. Los archivos Parquet deben ser compatibles con la especificación de Apache Iceberg y tener estadísticas de columnas completas. La carga rápida no detecta valores no válidos (como marcas de tiempo fuera de rango) en los archivos porque no se leen ni se vuelven a procesar. Para obtener más información sobre cómo cargar archivos Parquet, consulta Cómo cargar datos Parquet en una tabla nueva.

Para cargar rápidamente archivos Parquet planos en una tabla de Iceberg existente, usa el comando bq load:

bq load \
    --copy_files_only \
    --source_format=PARQUET \
    DATASET_NAME.TABLE_NAME \
    PATH_TO_SOURCE

Reemplaza lo siguiente:

  • DATASET_NAME: Es el conjunto de datos que contiene tu tabla Iceberg.
  • TABLE_NAME: Es el nombre de la tabla de Iceberg en la que cargas los datos.
  • PATH_TO_SOURCE: Es un URI de Cloud Storage completamente calificado o una lista de URI separados por comas. También se admiten comodines. Por ejemplo, gs://mybucket/mydata*.parquet

Carga datos estándar desde archivos planos

Las tablas de Iceberg usan trabajos de carga de BigQuery para cargar archivos externos en tablas de Iceberg. Si tienes una tabla de Iceberg existente, sigue la guía de la CLI de bq load o la guía de SQL de LOAD para cargar datos externos. Después de cargar los datos, se escriben archivos Parquet nuevos en la carpeta STORAGE_URI/data.

Si se usan las instrucciones anteriores sin una tabla de Iceberg existente, se creará una tabla de BigQuery.

Consulta lo siguiente para ver ejemplos específicos de herramientas de cargas por lotes en tablas administradas:

SQL

LOAD DATA INTO MANAGED_TABLE_NAME
FROM FILES (
uris=['STORAGE_URI'],
format='FILE_FORMAT');

Reemplaza lo siguiente:

  • MANAGED_TABLE_NAME: Es el nombre de una tabla de Iceberg existente.
  • STORAGE_URI: Es un URI de Cloud Storage completamente calificado o una lista de URI separados por comas. También se admiten comodines. Por ejemplo, gs://mybucket/table
  • FILE_FORMAT: Es el formato de la tabla de origen. Para conocer los formatos compatibles, consulta la fila format de load_option_list.

bq

bq load \
  --source_format=FILE_FORMAT \
  MANAGED_TABLE \
  STORAGE_URI

Reemplaza lo siguiente:

  • FILE_FORMAT: Es el formato de la tabla de origen. Para conocer los formatos compatibles, consulta la fila format de load_option_list.
  • MANAGED_TABLE_NAME: Es el nombre de una tabla de Iceberg existente.
  • STORAGE_URI: Es un URI de Cloud Storage completamente calificado o una lista de URI separados por comas. También se admiten comodines. Por ejemplo, gs://mybucket/table

Carga estándar desde archivos particionados por Hive

Puedes cargar archivos particionados por Hive en tablas Iceberg con trabajos de carga estándar de BigQuery. Para obtener más información, consulta Carga datos con particiones externas.

Carga datos de transmisión desde Pub/Sub

Puedes cargar datos de transmisión en tablas Iceberg con una suscripción de BigQuery a Pub/Sub.

Exporta datos de tablas de Iceberg

En las siguientes secciones, se describe cómo exportar datos de tablas de Iceberg a varios formatos de tabla.

Exporta datos a formatos planos

Para exportar una tabla de Iceberg a un formato plano, usa la sentencia EXPORT DATA y selecciona un formato de destino. Para obtener más información, consulta Cómo exportar datos.

Lee tablas de Iceberg con metadatos de Iceberg

Para leer datos de tablas de Iceberg en formato Iceberg, sigue estos pasos:

  1. Exporta los metadatos al formato Iceberg con la instrucción de SQL EXPORT TABLE METADATA.

  2. Configura y lee datos de tablas en Apache Spark con HadoopCatalog.

    En el siguiente ejemplo, se configura tu entorno para usar Spark SQL con Apache Iceberg y, luego, se ejecuta una consulta para recuperar datos de una tabla de Iceberg especificada.

    spark-sql \
     --packages org.apache.iceberg:iceberg-spark-runtime-ICEBERG_VERSION_NUMBER \
     --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
     --conf spark.sql.catalog.CATALOG_NAME.type=hadoop \
     --conf spark.sql.catalog.CATALOG_NAME.warehouse='BUCKET_PATH' \
    
    # Queries the table
    spark-sql> SELECT * FROM CATALOG_NAME.FOLDER_NAME;

    Reemplaza lo siguiente:

    • ICEBERG_VERSION_NUMBER: Es la versión actual del entorno de ejecución de Apache Spark Iceberg. Descarga la versión más reciente de Spark Releases.
    • CATALOG_NAME: Es el catálogo para hacer referencia a tu tabla de Iceberg.
    • BUCKET_PATH: Es la ruta de acceso al bucket que contiene los archivos de la tabla. Por ejemplo, gs://mybucket/
    • FOLDER_NAME: Es la carpeta que contiene los archivos de la tabla. Por ejemplo, myfolder

Modifica tablas de Iceberg

Para modificar una tabla Iceberg, sigue los pasos que se muestran en Modifica esquemas de tablas.

Precios

Los precios de las tablas de iceberg consisten en tres componentes independientes:

Almacenamiento

La tabla de Iceberg almacena todos los datos en Cloud Storage. Se te cobra por todos los datos almacenados, incluidos los datos históricos de las tablas. También se pueden aplicar los cargos de transferencia y el procesamiento de datos de Cloud Storage, según corresponda. No hay tarifas de almacenamiento específicas de BigQuery. Para obtener más información, consulta los Precios de Cloud Storage.

Optimización del almacenamiento

Las tablas de Iceberg requieren operaciones de optimización del almacenamiento, como la combinación de archivos y la reagrupación. Estas operaciones de optimización usan ranuras de pago por uso de la edición empresarial y no usan reservas BACKGROUND existentes.

Las operaciones de exportación de datos que se realizan durante la transmisión a través de la API de BigQuery Storage Write se incluyen en los precios de la API de Storage Write y no se cobran como mantenimiento en segundo plano. Para obtener más información, consulta Precios por transferencia de datos.

Consultas y trabajos

Al igual que con las tablas de BigQuery, se te cobra por las consultas y los bytes leídos (por TiB) si usas los precios según demanda de BigQuery o el consumo de ranuras (por ranura-hora) si usas los precios de procesamiento de capacidad de BigQuery.

Los precios de BigQuery también se aplican a la API de BigQuery Storage Read y a la API de BigQuery Storage Write.

Las operaciones de carga y exportación (como EXPORT METADATA) usan ranuras de pago por uso de la edición Enterprise. Esto difiere de las tablas de BigQuery, que no se cobran por estas operaciones. Si hay reservas PIPELINE con ranuras de Enterprise o Enterprise Plus disponibles, las operaciones de carga y exportación usan de preferencia estas ranuras de reserva.

Limitaciones

Las tablas de Iceberg tienen las siguientes limitaciones: