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:
- Mutaciones de tablas con el lenguaje de manipulación de datos (DML) de GoogleSQL
- Transmisión continua unificada por lotes y de alta capacidad de procesamiento con la API de Storage Write a través de conectores de BigLake, como Spark, Dataflow y otros motores.
- Evolución del esquema, que te permite agregar, descartar y cambiar el nombre de las columnas según tus necesidades. Esta función también te permite cambiar el tipo de datos de una columna existente y el modo de columna. Para obtener más información, consulta las reglas de conversión de tipos.
- Optimización automática del almacenamiento, que incluye el tamaño de archivo adaptable, el agrupamiento automático, la recolección de elementos no utilizados y la optimización de metadatos.
- Seguridad a nivel de la columna y enmascaramiento de datos.
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:
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 crear tablas de Iceberg, haz lo siguiente:
-
Propietario de datos de BigQuery (
roles/bigquery.dataOwner
) en tu proyecto -
Administrador de conexión de BigQuery (
roles/bigquery.connectionAdmin
) en tu proyecto
-
Propietario de datos de BigQuery (
-
Para consultar tablas de Iceberg, sigue estos pasos:
-
Visualizador de datos de BigQuery (
roles/bigquery.dataViewer
) en tu proyecto -
Usuario de BigQuery (
roles/bigquery.user
) en tu proyecto
-
Visualizador de datos de BigQuery (
-
Para que la cuenta de servicio de conexión lea y escriba datos en Cloud Storage, sigue estos pasos:
-
Administrador de objetos de almacenamiento (
roles/storage.objectAdmin
) en el bucket -
Lector de buckets heredados de almacenamiento (
roles/storage.legacyBucketReader
) en el bucket
-
Administrador de objetos de almacenamiento (
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 proyectobigquery.jobs.create
en tu proyectobigquery.readsessions.create
en tu proyectobigquery.tables.create
en tu proyectobigquery.tables.get
en tu proyectobigquery.tables.getData
en tu proyectostorage.buckets.get
en tu proyectostorage.objects.create
en tu proyectostorage.objects.delete
en tu proyectostorage.objects.get
en tu proyectostorage.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
deload_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
deload_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:
Exporta los metadatos al formato Iceberg con la instrucción de SQL
EXPORT TABLE METADATA
.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:
- Las tablas Iceberg no admiten operaciones de cambio de nombre ni declaraciones
ALTER TABLE RENAME TO
. - Las tablas de Iceberg no admiten copias de tablas ni declaraciones
CREATE TABLE COPY
. - Las tablas de Iceberg no admiten clonaciones de tablas ni declaraciones
CREATE TABLE CLONE
. - Las tablas de Iceberg no admiten instantáneas de tablas ni declaraciones
CREATE SNAPSHOT TABLE
. - Las tablas de Iceberg no admiten el siguiente esquema de tabla:
- Esquema vacío
- Esquema con tipos de datos
INTERVAL
,JSON
,RANGE
oGEOGRAPHY
. - Esquema con comparaciones de campos.
- Esquema con expresiones de valor predeterminado.
EXPORT METADATA
no admite tablas que contengan tipos de datosBIGNUMERIC
oNUMERIC
con precisión superior a 38 puntos.- Las tablas Iceberg no admiten los siguientes casos de evolución del esquema:
- Coerciones de tipo de
NUMERIC
aFLOAT
- Coerciones de tipo de
INT
aFLOAT
- Agregar nuevos campos anidados a columnas
RECORD
existentes con instrucciones de DDL de SQL
- Coerciones de tipo de
- Las tablas Iceberg muestran un tamaño de almacenamiento de 0 bytes cuando la consola o las APIs las consultan.
- Las tablas de Iceberg no admiten vistas materializadas.
- Las tablas Iceberg no admiten transacciones de varias declaraciones.
- Las tablas Iceberg no admiten actualizaciones de captura de datos modificados (CDC).
- Cuando transmites datos a tablas de Iceberg con la API de BigQuery Storage Write, primero debes inhabilitar la caché de consultas.
- Las tablas Iceberg no admiten la recuperación ante desastres administrada.
- Las tablas Iceberg no admiten el particionado. Considera el agrupamiento en clústeres como una alternativa.
- Las tablas Iceberg no admiten la seguridad a nivel de fila.
- Las tablas Iceberg no admiten viajes en el tiempo.
- Las tablas Iceberg no admiten ventanas de seguridad ante fallas.
- Las tablas Iceberg no admiten trabajos de extracción.
- La vista
INFORMATION_SCHEMA.TABLE_STORAGE
no incluye tablas Iceberg. - Las tablas Iceberg no se admiten como destinos de resultados de consultas.
CREATE OR REPLACE
no admite reemplazar tablas estándar por tablas de Iceberg ni tablas de Iceberg por tablas estándar.- La carga por lotes y las sentencias
LOAD DATA
solo admiten agregar datos a tablas de iceberg existentes. - La carga por lotes y las declaraciones
LOAD DATA
no admiten actualizaciones de esquemas. TRUNCATE TABLE
no admite tablas Iceberg. Existen dos alternativas:CREATE OR REPLACE TABLE
, con las mismas opciones de creación de tablas.DELETE FROM
tablaWHERE
verdadero
- La función con valor de tabla (TVF)
APPENDS
no admite tablas Iceberg. - Las exportaciones de Iceberg en Apache Spark no contienen datos transmitidos recientemente en el almacenamiento optimizado para escritura.
- La carga rápida no admite archivos con nombres de columnas flexibles.