Lavorare con le tabelle Iceberg utilizzando Trino - AWS Guida prescrittiva

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Lavorare con le tabelle Iceberg utilizzando Trino

Questa sezione descrive come configurare e gestire le tabelle Iceberg utilizzando Trino su Amazon EMR. Gli esempi sono codice standard che puoi eseguire su un Amazon EMR su cluster. EC2 Gli esempi di codice e le configurazioni in questa sezione presuppongono che tu stia utilizzando la release emr-7.9.0 di Amazon EMR.

Amazon EMR in fase di configurazione EC2

  1. Crea un iceberg.properties file con il seguente contenuto. L'iceberg.file-format=parquetimpostazione determina il formato di archiviazione predefinito per le nuove tabelle se il formato non è specificato esplicitamente nell'CREATE TABLEistruzione.

    connector.name=iceberg iceberg.catalog.type=glue iceberg.file-format=parquet fs.native-s3.enabled=true
  2. Carica il file iceberg.properties nel bucket S3. 

  3. Crea un'azione di bootstrap che copia il iceberg.properties file dal tuo bucket S3 e lo archivia come file di configurazione Trino nel cluster Amazon EMR che creerai. Assicurati di sostituirlo <S3-bucket-name> con il nome del tuo bucket S3. 

    #!/bin/bash set -ex sudo aws s3 cp s3://<S3-bucket-name>/iceberg.properties /etc/trino/conf/catalog/iceberg.properties
  4. Crea un cluster Amazon EMR con Trino installato e specifica l'esecuzione dello script precedente come azione di bootstrap. Ecco un esempio di comando AWS Command Line Interface (AWS CLI) per creare il cluster:

    aws emr create-cluster --release-label emr-7.9.0 \ --applications Name=Trino \ --region <region> \ --name Trino_Iceberg_Cluster \ --bootstrap-actions '[{"Path":"s3://<S3-bucket-name>/bootstrap.sh","Name":"Add iceberg.properties"}]' \ --instance-groups '[{"InstanceGroupType":"MASTER","InstanceCount":1,"InstanceType":"m5.xlarge"},{"InstanceGroupType":"CORE","InstanceCount":3,"InstanceType":"m5.xlarge"}]' \ --service-role "<IAM-service-role>" \ --ec2-attributes '{"KeyName":"<key-name>","InstanceProfile":"<EMR-EC2-instance-profile>"}'

    dove sostituisci:

    • <S3-bucket-name>con il nome del tuo bucket S3

    • <region>con le tue specifiche Regione AWS

    • <key-name>con la tua key pair. Se la key pair non esiste, verrà creata.

    • <IAM-service-role>con il tuo ruolo di servizio Amazon EMR che segue il principio del privilegio minimo

    • <EMR-EC2-instance-profile>con il profilo della tua istanza

  5. Una volta inizializzato il cluster Amazon EMR, puoi inizializzare una sessione Trino eseguendo il seguente comando:

    trino-cli
  6. Nella CLI di Trino, puoi visualizzare i cataloghi eseguendo:

    SHOW CATALOGS;

Creazione di tabelle Iceberg

Per creare una tabella Iceberg, puoi usare l'istruzione. CREATE TABLE  Ecco un esempio di creazione di una tabella partizionata che utilizza il partizionamento nascosto Iceberg:

CREATE TABLE iceberg.iceberg_db.iceberg_table ( userid int, firstname varchar, city varchar) WITH ( format = 'PARQUET', partitioning = ARRAY['city', 'bucket(userid, 16)'], location = 's3://<S3-bucket>/<prefix>');
Nota

Se non specifichi il formato, verrà utilizzato il iceberg.file-format valore configurato nella sezione precedente.

Per inserire dati, usa il INSERT INTO comando. Ecco un esempio:

INSERT INTO iceberg.iceberg_db.iceberg_table (userid, firstname, city) VALUES (1001, 'John', 'New York'), (1002, 'Mary', 'Los Angeles'), (1003, 'Mateo', 'Chicago'), (1004, 'Shirley', 'Houston'), (1005, 'Diego', 'Miami'), (1006, 'Nikki', 'Seattle'), (1007, 'Pat', 'Boston'), (1008, 'Terry', 'San Francisco'), (1009, 'Richard', 'Denver'), (1010, 'Pat', 'Phoenix');

Leggere dalle tabelle Iceberg

È possibile leggere lo stato più recente della tabella Iceberg utilizzando un'SELECTistruzione, come segue:

SELECT * FROM iceberg.iceberg_db.iceberg_table;

Trasformazione dei dati in tabelle Iceberg

È possibile eseguire un'operazione di upsert (inserire contemporaneamente nuovi record e aggiornare quelli esistenti) utilizzando l'istruzione. MERGE INTO Ecco un esempio:

MERGE INTO iceberg.iceberg_db.iceberg_table target USING ( VALUES (1001, 'John Updated', 'Boston'), -- Update existing user (1002, 'Mary Updated', 'Seattle'), -- Update existing user (1011, 'Martha', 'Portland'), -- Insert new user (1012, 'Paulo', 'Austin') -- Insert new user ) AS source (userid, firstname, city) ON target.userid = source.userid WHEN MATCHED THEN UPDATE SET firstname = source.firstname, city = source.city WHEN NOT MATCHED THEN INSERT (userid, firstname, city) VALUES (source.userid, source.firstname, source.city);

Eliminazione di record dalle tabelle Iceberg

Per eliminare i dati da una tabella Iceberg, utilizzate l'DELETE FROMespressione e specificate un filtro che corrisponda alle righe da eliminare. Ecco un esempio:

DELETE FROM iceberg.iceberg_db.iceberg_table WHERE userid IN (1003, 1004);

Esecuzione di query sui metadati di tabelle Iceberg

Iceberg fornisce l'accesso ai suoi metadati tramite SQL. È possibile accedere ai metadati per ogni tabella (<table_name>) interrogando il namespace. "<table_name>.$<metadata_table>" Per un elenco completo delle tabelle di metadati, consulta Ispezione delle tabelle nella documentazione di Iceberg.

Ecco un elenco di esempio di query per ispezionare i metadati di Iceberg:

SELECT FROM iceberg.iceberg_db."iceberg_table$snapshots"; SELECT FROM iceberg.iceberg_db."iceberg_table$history"; SELECT FROM iceberg.iceberg_db."iceberg_table$partitions"; SELECT FROM iceberg.iceberg_db."iceberg_table$files"; SELECT FROM iceberg.iceberg_db."iceberg_table$manifests"; SELECT FROM iceberg.iceberg_db."iceberg_table$refs"; SELECT * FROM iceberg.iceberg_db."iceberg_table$metadata_log_entries";

Ad esempio, questa query:

SELECT * FROM iceberg.iceberg_db."iceberg_table$snapshots";

fornisce l'output:

Risultato dell'interrogazione dei metadati della tabella Iceberg.

Usare i viaggi nel tempo

Ogni operazione di scrittura (inserimento, aggiornamento, annullamento o eliminazione) in una tabella Iceberg crea una nuova istantanea. È quindi possibile utilizzare queste istantanee per viaggiare nel tempo, per tornare indietro nel tempo e controllare lo stato di una tabella nel passato.

La seguente interrogazione sui viaggi nel tempo mostra lo stato di una tabella in base a uno specifico: snapshot_id

SELECT * FROM iceberg.iceberg_db.iceberg_table FOR VERSION AS OF 241938428756831817;

La seguente query sul viaggio nel tempo mostra lo stato di una tabella in base a un timestamp specifico:

SELECT * FROM iceberg.iceberg_db.iceberg_table FOR TIMESTAMP AS OF TIMESTAMP '2025-05-28 16:09:40.268 UTC'

Considerazioni sull'utilizzo di Iceberg con Trino

Le operazioni di scrittura di Trino sulle tabelle Iceberg seguono la merge-on-readprogettazione, quindi creano file di eliminazione posizionali invece di riscrivere interi file di dati interessati da aggiornamenti o eliminazioni. Se vuoi usare questo copy-on-write approccio, prendi in considerazione l'utilizzo di Spark per le operazioni di scrittura.