Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Arbeiten mit Iceberg-Tabellen mithilfe von Trino
In diesem Abschnitt wird beschrieben, wie Sie Iceberg-Tabellen mithilfe von Trino
Amazon EMR bei der Einrichtung EC2
-
Erstellen Sie eine
iceberg.properties
Datei mit dem folgenden Inhalt. Dieiceberg.file-format=parquet
Einstellung bestimmt das Standardspeicherformat für neue Tabellen, wenn das Format in derCREATE TABLE
Anweisung nicht explizit angegeben ist.connector.name=iceberg iceberg.catalog.type=glue iceberg.file-format=parquet fs.native-s3.enabled=true
-
Laden Sie die Datei
iceberg.properties
in Ihren S3-Bucket hoch. -
Erstellen Sie eine Bootstrap-Aktion, die die
iceberg.properties
Datei aus Ihrem S3-Bucket kopiert und als Trino-Konfigurationsdatei auf dem Amazon EMR-Cluster speichert, den Sie erstellen werden. Stellen Sie sicher, dass Sie es durch Ihren<S3-bucket-name>
S3-Bucket-Namen ersetzen.#!/bin/bash set -ex sudo aws s3 cp s3://<S3-bucket-name>/iceberg.properties /etc/trino/conf/catalog/iceberg.properties
-
Erstellen Sie einen Amazon EMR-Cluster, auf dem Trino installiert ist, und geben Sie die Ausführung des vorherigen Skripts als Bootstrap-Aktion an. Hier ist ein Beispielbefehl AWS Command Line Interface (AWS CLI) zum Erstellen des Clusters:
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>"}'
wo Sie ersetzen:
-
<S3-bucket-name>
mit Ihrem S3-Bucket-Namen -
<region>
mit deinem spezifischen AWS-Region -
<key-name>
mit deinem key pair. Wenn das key pair nicht existiert, wird es erstellt. -
<IAM-service-role>
mit Ihrer Amazon EMR-Servicerolle, die dem Prinzip der geringsten Rechtefolgt. -
<EMR-EC2-instance-profile>
mit Ihrem Instance-Profil.
-
-
Wenn der Amazon EMR-Cluster initialisiert wurde, können Sie eine Trino-Sitzung initialisieren, indem Sie den folgenden Befehl ausführen:
trino-cli
-
In der Trino CLI können Sie die Kataloge anzeigen, indem Sie Folgendes ausführen:
SHOW CATALOGS;
Erstellen von Iceberg-Tabellen
Um eine Iceberg-Tabelle zu erstellen, können Sie die Anweisung verwenden. CREATE TABLE
Hier ist ein Beispiel für die Erstellung einer partitionierten Tabelle, die die versteckte Iceberg-Partitionierung verwendet:
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>');
Anmerkung
Wenn Sie das Format nicht angeben, wird der iceberg.file-format
Wert verwendet, den Sie im vorherigen Abschnitt konfiguriert haben.
Verwenden Sie den INSERT INTO
Befehl, um Daten einzufügen. Ein Beispiel:
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');
Aus Iceberg-Tabellen lesen
Sie können den aktuellen Status Ihrer Iceberg-Tabelle mithilfe einer SELECT
Anweisung wie folgt ablesen:
SELECT * FROM iceberg.iceberg_db.iceberg_table;
Daten in Iceberg-Tabellen importieren
Sie können einen Upsert-Vorgang ausführen (gleichzeitig neue Datensätze einfügen und bestehende aktualisieren), indem Sie die Anweisung verwenden. MERGE INTO
Ein Beispiel:
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);
Löschen von Datensätzen aus Iceberg-Tabellen
Um Daten aus einer Iceberg-Tabelle zu löschen, verwenden Sie den DELETE FROM
Ausdruck und geben Sie einen Filter an, der den zu löschenden Zeilen entspricht. Ein Beispiel:
DELETE FROM iceberg.iceberg_db.iceberg_table WHERE userid IN (1003, 1004);
Iceberg-Tabellen-Metadaten abfragen
Iceberg bietet Zugriff auf seine Metadaten über SQL. Sie können auf die Metadaten für jede beliebige Tabelle (<table_name>
) zugreifen, indem Sie den Namespace abfragen. "<table_name>.$<metadata_table>"
Eine vollständige Liste der Metadatentabellen finden Sie in der Iceberg-Dokumentation unter Tabellen
Hier ist ein Beispiel für eine Liste von Abfragen zur Untersuchung von Iceberg-Metadaten:
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";
Beispielsweise würde diese Abfrage:
SELECT * FROM iceberg.iceberg_db."iceberg_table$snapshots";
liefert die Ausgabe:

Zeitreisen nutzen
Jeder Schreibvorgang (Einfügen, Aktualisieren, Hochsetzen oder Löschen) in einer Iceberg-Tabelle erstellt einen neuen Snapshot. Sie können diese Snapshots dann für Zeitreisen verwenden, um in die Vergangenheit zu reisen und den Status einer Tabelle in der Vergangenheit zu überprüfen.
Die folgende Zeitreise-Abfrage zeigt den Status einer Tabelle auf der Grundlage eines bestimmten Status an: snapshot_id
SELECT * FROM iceberg.iceberg_db.iceberg_table FOR VERSION AS OF 241938428756831817;
Die folgende Zeitreiseabfrage zeigt den Status einer Tabelle auf der Grundlage eines bestimmten Zeitstempels an:
SELECT * FROM iceberg.iceberg_db.iceberg_table FOR TIMESTAMP AS OF TIMESTAMP '2025-05-28 16:09:40.268 UTC'
Überlegungen zur Verwendung von Iceberg mit Trino
Die Schreiboperationen von Trino auf Iceberg-Tabellen folgen dem merge-on-readDesign, sodass sie positionsabhängige Löschdateien erstellen, anstatt ganze Datendateien neu zu schreiben, die von Aktualisierungen oder Löschungen betroffen sind. Wenn Sie diesen copy-on-write Ansatz verwenden möchten, sollten Sie die Verwendung von Spark für Schreiboperationen in Betracht ziehen.