Utilisation des tables Iceberg à l'aide de Trino - AWS Conseils prescriptifs

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation des tables Iceberg à l'aide de Trino

Cette section explique comment configurer et utiliser les tables Iceberg à l'aide de Trino sur Amazon EMR. Les exemples sont du code standard que vous pouvez exécuter sur un Amazon EMR sur un cluster. EC2 Les exemples de code et les configurations présentés dans cette section supposent que vous utilisez la version emr-7.9.0 d'Amazon EMR.

Amazon EMR lors de la configuration EC2

  1. Créez un iceberg.properties fichier avec le contenu suivant. Le iceberg.file-format=parquet paramètre détermine le format de stockage par défaut pour les nouvelles tables si le format n'est pas explicitement spécifié dans l'CREATE TABLEinstruction.

    connector.name=iceberg iceberg.catalog.type=glue iceberg.file-format=parquet fs.native-s3.enabled=true
  2. Chargez le fichier iceberg.properties dans votre compartiment S3. 

  3. Créez une action bootstrap qui copie le iceberg.properties fichier depuis votre compartiment S3 et le stocke en tant que fichier de configuration Trino sur le cluster Amazon EMR que vous allez créer. Assurez-vous de le remplacer <S3-bucket-name> par le nom de votre compartiment S3. 

    #!/bin/bash set -ex sudo aws s3 cp s3://<S3-bucket-name>/iceberg.properties /etc/trino/conf/catalog/iceberg.properties
  4. Créez un cluster Amazon EMR sur lequel Trino est installé et spécifiez l'exécution du script précédent sous forme d'action d'amorçage. Voici un exemple de commande AWS Command Line Interface (AWS CLI) pour créer le 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>"}'

    où vous remplacez :

    • <S3-bucket-name>avec le nom de votre compartiment S3

    • <region>avec votre spécifique Région AWS

    • <key-name>avec votre paire de clés. Si la paire de clés n'existe pas, elle sera créée.

    • <IAM-service-role>avec votre rôle de service Amazon EMR qui respecte le principe du moindre privilège

    • <EMR-EC2-instance-profile>avec votre profil d'instance

  5. Lorsque le cluster Amazon EMR a été initialisé, vous pouvez initialiser une session Trino en exécutant la commande suivante :

    trino-cli
  6. Dans la CLI Trino, vous pouvez consulter les catalogues en exécutant :

    SHOW CATALOGS;

Création de tables Iceberg

Pour créer une table Iceberg, vous pouvez utiliser l'CREATE TABLEinstruction.  Voici un exemple de création d'une table partitionnée utilisant le partitionnement caché d'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>');
Note

Si vous ne spécifiez pas le format, la iceberg.file-format valeur que vous avez configurée dans la section précédente sera utilisée.

Pour insérer des données, utilisez la INSERT INTO commande. Voici un exemple :

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');

Lecture depuis les tables Iceberg

Vous pouvez consulter le dernier statut de votre table Iceberg à l'aide d'une SELECT instruction, comme suit :

SELECT * FROM iceberg.iceberg_db.iceberg_table;

Insérer des données dans des tables Iceberg

Vous pouvez effectuer une opération upsert (insérer simultanément de nouveaux enregistrements et mettre à jour les enregistrements existants) à l'aide de l'MERGE INTOinstruction. Voici un exemple :

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);

Supprimer des enregistrements des tables Iceberg

Pour supprimer des données d'une table Iceberg, utilisez l'DELETE FROMexpression et spécifiez un filtre correspondant aux lignes à supprimer. Voici un exemple :

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

Interrogation des métadonnées d'une table Iceberg

Iceberg fournit un accès à ses métadonnées via SQL. Vous pouvez accéder aux métadonnées d'une table donnée (<table_name>) en interrogeant l'espace de noms"<table_name>.$<metadata_table>". Pour obtenir la liste complète des tables de métadonnées, consultez la section Inspection des tables dans la documentation d'Iceberg.

Voici un exemple de liste de requêtes permettant d'inspecter les métadonnées d'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";

Par exemple, cette requête :

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

fournit le résultat :

Résultat de l'interrogation des métadonnées de la table Iceberg.

Utiliser le voyage dans le temps

Chaque opération d'écriture (insertion, mise à jour, modification ou suppression) dans une table Iceberg crée un nouvel instantané. Vous pouvez ensuite utiliser ces instantanés pour voyager dans le temps, pour revenir dans le temps et vérifier le statut d'un tableau dans le passé.

La requête de voyage dans le temps suivante affiche le statut d'une table en fonction d'un paramètre spécifique snapshot_id :

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

La requête de voyage dans le temps suivante affiche le statut d'une table en fonction d'un horodatage spécifique :

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

Considérations relatives à l'utilisation d'Iceberg avec Trino

Les opérations d'écriture de Trino sur les tables Iceberg suivent le merge-on-readdesign, de sorte qu'elles créent des fichiers de suppression positionnels au lieu de réécrire des fichiers de données entiers affectés par les mises à jour ou les suppressions. Si vous souhaitez utiliser copy-on-write cette approche, pensez à utiliser Spark pour les opérations d'écriture.