Iceberg es un formato de tabla abierto para data lakes. El conector Iceberg le permite consultar archivos de datos en este formato.
Contexto
Para obtener más información sobre Iceberg, consulte Iceberg.
El conector Iceberg de Alibaba Cloud E-MapReduce (EMR) es compatible con las funciones que ofrece el conector Iceberg de la comunidad de código abierto. Además, gracias a una optimización profunda, el conector Iceberg de EMR proporciona las siguientes características:
Filtrado dinámico
Operaciones de lectura en tablas Iceberg V2
Pushdown de filtros de Iceberg
En este tema se describe la siguiente información sobre el conector Iceberg:
Requisitos previos
Cree un clúster de Hadoop con el servicio Presto desplegado o bien un clúster de Presto. Para obtener más información, consulte Create a cluster.
Límites
Solo los clústeres de Hadoop o Presto de EMR V3.38.0 y versiones posteriores admiten el conector Iceberg.
Configurar el conector Iceberg
Modifique la configuración del conector Iceberg. Para obtener más información, consulte Configure connectors.
Configuración predeterminada
En la consola de EMR, vaya a la Configure página del servicio Presto. En la sección Service Configuration, haga clic en la pestaña iceberg.properties. Busque el parámetro hive.metastore.uri, que especifica el URI para conectarse a Hive Metastore mediante el protocolo Thrift. Modifique el valor del parámetro según sus necesidades reales. El formato predeterminado es thrift://emr-header-1.cluster-24****:9083.
Parámetros
En la consola de EMR, vaya a la página del servicio Presto y haga clic en la pestaña Configure. En la sección Service Configuration, haga clic en la pestaña iceberg.properties y luego en Custom Configuration. A continuación puede agregar los siguientes elementos de configuración.
| Elemento de configuración | Descripción |
| iceberg.file-format | Formato de archivo en el que se almacenan los datos de las tablas Iceberg. Valores válidos:
|
| iceberg.compression-codec | Formato de compresión que se utiliza al escribir archivos. Valores válidos:
|
| iceberg.max-partitions-per-writer | Número máximo de particiones cuyos datos puede procesar cada escritor. Valor predeterminado: 100. |
Ejemplo: consultar datos en una tabla Iceberg
Utilice la sintaxis SQL básica de Presto para consultar datos en una tabla Iceberg.
Inicie sesión en el nodo maestro de su clúster mediante SSH. Para obtener más información, consulte Log on to a cluster.
-
Ejecute el siguiente comando para conectarse al cliente de Presto:
presto --server emr-header-1:9090 --catalog iceberg --schema defaultSi se devuelve la siguiente información, la conexión con el cliente de Presto se estableció correctamente:
presto:default> -
Ejecute el siguiente comando para crear una tabla llamada iceberg_test:
create table iceberg_test(id int); -
Ejecute el siguiente comando para insertar datos en la tabla iceberg_test:
insert into iceberg_test values(1),(2); -
Ejecute el siguiente comando para consultar los datos de la tabla iceberg_test:
select * from iceberg_test;Se devuelve la siguiente información:
id ---- 1 2
Sentencias SQL
El conector Iceberg permite leer y escribir datos en una tabla Iceberg, así como leer y escribir metadatos de la tabla. Además de las sentencias SQL básicas, este conector admite las sentencias que se describen en la siguiente tabla.
|
Sentencia SQL |
Descripción |
|
INSERT |
Para obtener más información, consulte INSERT en la documentación oficial de Presto. |
|
DELETE |
Consulte la sección Delete data by partition de este tema. Para obtener más información, consulte DELETE en la documentación oficial de Presto. |
|
Gestión de esquemas y tablas |
Consulte la sección Partition a table de este tema. Para obtener más información, consulte Schema and table management en la documentación oficial de Presto. |
|
Gestión de vistas materializadas |
Consulte la sección Manage materialized views de este tema. Para obtener más información, consulte Materialized views management en la documentación oficial de Presto. |
|
Gestión de vistas |
Para obtener más información, consulte Views management en la documentación oficial de Presto. |
Particionar una tabla
El conector Iceberg utiliza las funciones descritas en la siguiente tabla para particionar una tabla.
|
Función |
Descripción |
|
year(ts) |
Particiona una tabla por año. Devuelve la diferencia en años entre el valor de ts y el 1 de enero de 1970. |
|
month(ts) |
Particiona una tabla por mes. Devuelve la diferencia en meses entre el valor de ts y el 1 de enero de 1970. |
|
day(ts) |
Particiona una tabla por día. Devuelve la diferencia en días entre el valor de ts y el 1 de enero de 1970. |
|
hour(ts) |
Particiona una tabla por hora. Devuelve una marca de tiempo basada en el valor de ts e ignora los minutos y segundos de dicho valor. |
|
bucket(x, nbuckets) |
Aplica un particionamiento por hash a los datos y los distribuye en un número específico de buckets. Devuelve el valor hash entero de x, el cual se encuentra dentro del rango [0, nbuckets - 1). |
|
truncate(s, nchars) |
Devuelve los primeros nchars caracteres de s. |
Ejemplo: particione una tabla llamada customer_orders con base en el mes incluido en el valor de order_date, el valor hash de account_number (cantidad de buckets: 10) y country.
CREATE TABLE iceberg.testdb.customer_orders (
order_id BIGINT,
order_date DATE,
account_number BIGINT,
customer VARCHAR,
country VARCHAR)
WITH (partitioning = ARRAY['month(order_date)', 'bucket(account_number, 10)', 'country'])
Eliminar datos por partición
Si incluye una cláusula WHERE en una sentencia DELETE para filtrar particiones de una tabla particionada, el conector Iceberg elimina las particiones que cumplen las condiciones de filtro. Por ejemplo, ejecute la siguiente sentencia para eliminar de la tabla customer_orders todas las particiones que cumplan la condición de filtro country=US:
DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US'
El conector Iceberg solo permite eliminar datos por partición. Por ejemplo, la ejecución de la siguiente sentencia falla porque la cláusula WHERE filtra filas específicas dentro de las particiones:
DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US' AND customer = 'Freds Foods'
Revertir a una instantánea
Las tablas Iceberg admiten instantáneas.
El conector Iceberg proporciona una tabla de instantáneas del sistema para cada tabla Iceberg. Las instantáneas de cada tabla se identifican mediante ID de instantánea del tipo de datos BIGINT. Por ejemplo, ejecute la siguiente sentencia para consultar los ID de instantánea más recientes de la tabla customer_orders:
SELECT snapshot_id FROM iceberg.testdb."customer_orders$snapshots" ORDER BY committed_at DESC LIMIT 1
Ejecute la siguiente sentencia para revertir el estado de la tabla a una instantánea específica mediante su ID:
CALL iceberg.system.rollback_to_snapshot('testdb', 'customer_orders', 895459706749342****)
Consultar particiones de una tabla del sistema
El conector Iceberg permite consultar las particiones de una tabla del sistema. Por ejemplo, ejecute la siguiente sentencia para consultar las particiones de la tabla customer_orders. La información de las particiones incluye el valor máximo y mínimo de cada columna de clave de partición.
SELECT * FROM iceberg.testdb."customer_orders$partitions"
Propiedades de las tablas Iceberg
En la siguiente tabla se describen las propiedades de las tablas Iceberg.
| Propiedad | Descripción |
| format | Especifica el formato de archivo en el que se almacenan los datos de las tablas Iceberg. Valores válidos:
|
| partitioning | Especifica las columnas de clave de partición. Por ejemplo, si una tabla contiene las columnas de clave de partición c1 y c2, esta propiedad se establece en ARRAY['c1', 'c2']. |
| location | Especifica el URI del sistema de archivos que almacena las tablas. |
En la siguiente sentencia de ejemplo, la propiedad format se establece en PARQUET, partitioning en ARRAY['c1', 'c2'] y location en
/var/my_tables/test_table
:
CREATE TABLE test_table (
c1 integer,
c2 date,
c3 double)
WITH (
format = 'PARQUET',
partitioning = ARRAY['c1', 'c2'],
location = '/var/my_tables/test_table')
Gestionar vistas materializadas
El conector Iceberg admite vistas materializadas. Cada vista materializada consta de una definición de vista y una tabla Iceberg. El nombre de la tabla se almacena como una propiedad de la vista materializada y los datos se guardan en dicha tabla Iceberg.
En la siguiente tabla se describen las sentencias que se pueden ejecutar en las vistas materializadas.
| Sentencia | Descripción |
| CREATE MATERIALIZED VIEW | Crea una vista materializada. Utilice las propiedades de la tabla Iceberg para definir su formato de almacenamiento. Por ejemplo, establezca format en ORC y partitioning en ARRAY['event_date'] dentro de la cláusula WITH para almacenar los datos de la tabla Iceberg en archivos ORC y particionarla por día. |
| REFRESH MATERIALIZED VIEW | Actualiza los datos de una vista materializada. Después de ejecutar la sentencia, se eliminan los datos de la tabla Iceberg. Luego se insertan en la vista materializada los resultados de la consulta definida por esta misma. Importante Existe una ventana de tiempo breve entre las operaciones de eliminación e inserción. Si la operación de inserción falla mientras la vista materializada está vacía, esta permanecerá sin datos. También puede ejecutar esta sentencia para eliminar la definición y la tabla Iceberg de una vista materializada. |