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
Enable the BigQuery Connection and BigQuery Reservation APIs.
Si usas un procedimiento almacenado para Spark en BigQuery para crear tablas de Iceberg de solo lectura, debes seguir estos pasos:
Para almacenar los metadatos y los archivos de datos de la tabla de Iceberg de solo lectura en Cloud Storage, crea un bucket de Cloud Storage. Debes conectarte a tu bucket de Cloud Storage para acceder a los archivos de metadatos. Para hacerlo, sigue estos pasos:
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:
-
Administrador de BigQuery (
roles/bigquery.admin
) -
Administrador de objetos de Storage (
roles/storage.objectAdmin
)
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 crearEn 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
.
- Ejemplo para AWS:
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 tablaPor ejemplo,
mydataset
.EXTERNAL_TABLE
: el nombre de la tabla que deseas crearPor 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
Crea un archivo de definición de tabla:
bq mkdef --source_format=ICEBERG \ "URI" > TABLE_DEFINITION_FILE
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 recientePor ejemplo,
gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json
.TABLE_DEFINITION_FILE
: el nombre del archivo que contiene el esquema de la tablaPROJECT_ID
: el ID del proyecto que contiene la tabla que deseas actualizarDATASET
: el conjunto de datos que contiene la tabla que deseas actualizarTABLE
: 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 actualizarDATASET
: el conjunto de datos que contiene la tabla que deseas actualizarTABLE
: 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
.
- Ejemplo para AWS:
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íficaPor 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
.
- Ejemplo para AWS:
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 BigQueryque contiene la tabla que deseas actualizar. Por ejemplo,
mydataset
.EXTERNAL_TABLE
: el nombre de la tabla que deseas crearPor 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?
- Obtén más información sobre el procedimiento almacenado para Spark.
- Obtén más información sobre las políticas de control de acceso.
- Obtén más información sobre cómo ejecutar consultas en BigQuery.
- Obtén más información sobre las declaraciones compatibles y los dialectos de SQL en BigQuery.