Apache Iceberg™-Tabellen verwalten

Apache Iceberg™-Tabellen in Snowflake verwalten:

Sie können auch eine Iceberg-Tabelle, die einen externen Katalog verwendet, in eine Tabelle konvertieren, die Snowflake als Iceberg-Katalog verwendet. Weitere Informationen dazu finden Sie unter Apache Iceberg™-Tabelle konvertieren, um Snowflake als Katalog zu verwenden.

Eine Tabelle abfragen

Um eine Iceberg-Tabelle abzufragen, muss ein Benutzer die folgenden Berechtigungen erhalten oder erben:

  • Die USAGE-Berechtigung für die Datenbank und das Schema, die die Tabelle enthalten

  • Die SELECT-Berechtigungen für die Tabelle

Sie können eine Iceberg-Tabelle mit einer SELECT-Anweisung abfragen. Beispiel:

SELECT col1, col2 FROM my_iceberg_table;
Copy

DML -Befehle verwenden

Iceberg-Tabellen, die Snowflake als Katalog verwenden, unterstützen vollständig Befehle der Datenbearbeitungssprache (DML):

Von Snowflake verwaltete Tabellen unterstützen auch effizientes Massenladen mit Features wie COPY INTO <Tabelle> und Snowpipe. Weitere Informationen dazu finden Sie unter Laden von Daten in Apache Iceberg™-Tabellen.

Bemerkung

Snowflake unterstützt auch das Schreiben in extern verwaltete Iceberg-Tabellen (Vorschau). Weitere Informationen dazu finden Sie unter Schreibunterstützung für extern verwaltete Apache Iceberg™-Tabellen und Schreiben in extern verwaltete Iceberg-Tabellen.

Beispiel: Eine Tabelle aktualisieren

Sie können INSERT- und UPDATE- Anweisungen verwenden, um von Snowflake verwaltete Iceberg-Tabellen zu ändern.

Im folgenden Beispiel wird in eine Iceberg-Tabelle namens store_sales ein neuer Wert eingefügt, und dann wird die Spalte cola auf 1 aktualisiert, wenn der Wert derzeit -99 ist.

INSERT INTO store_sales VALUES (-99);

UPDATE store_sales
  SET cola = 1
  WHERE cola = -99;
Copy

Snapshots von DML-Änderungen generieren

Bei Tabellen, die Snowflake als Katalog verwenden, generiert Snowflake automatisch die Iceberg-Metadaten. Snowflake schreibt die Metadaten in einen Ordner namens metadata auf Ihrem externen Volume. Um den Ordner metadata zu finden, siehe Daten- und Metadatenverzeichnisse.

Alternativ können Sie die Funktion SYSTEM$GET_ICEBERG_TABLE_INFORMATION aufrufen, um Iceberg-Metadaten für alle neuen Änderungen zu generieren.

Bei Tabellen, die nicht von Snowflake verwaltet werden, gibt die Funktion Informationen zum letzten aktualisierten Snapshot zurück.

Beispiel:

SELECT SYSTEM$GET_ICEBERG_TABLE_INFORMATION('db1.schema1.it1');
Copy

Ausgabe:

+-----------------------------------------------------------------------------------------------------------+
| SYSTEM$GET_ICEBERG_TABLE_INFORMATION('DB1.SCHEMA1.IT1')                                                   |
|-----------------------------------------------------------------------------------------------------------|
| {"metadataLocation":"s3://mybucket/metadata/v1.metadata.json","status":"success"}                         |
+-----------------------------------------------------------------------------------------------------------+

Löschungen auf Zeilenebene verwenden

Bemerkung

Wird nur für extern verwaltete Iceberg-Tabellen unterstützt.

Snowflake unterstützt die Abfrage von extern verwalteten Iceberg-Tabellen, wenn Sie Löschungen auf Zeilenebene für Aktualisierungs-, Lösch- und Zusammenführungsoperationen konfiguriert haben.

Wie Sie Löschungen auf Zeilenebene konfigurieren können, finden Sie unter Schreibeigenschaften in der Apache Iceberg Dokumentation.

Copy-on-Write vs. Merge-on-Read

Iceberg bietet zwei Modi, um zu konfigurieren, wie Compute Engines Operationen auf Zeilenebene für extern verwaltete Tabellen behandeln. Snowflake unterstützt diese beiden Modi.

Die folgende Tabelle beschreibt, wann Sie die einzelnen Modi verwenden sollten:

Modus

Beschreibung

Copy-on-Write (Standard)

Dieser Modus priorisiert die Lesezeit und beeinträchtigt die Schreibgeschwindigkeit.

Wenn Sie einen Aktualisierungs-, Lösch- oder Zusammenführungsvorgang durchführen, schreibt Ihre Compute Engine die gesamte betroffene Parquet-Datendatei neu. Dies kann zu langsamen Schreibvorgängen führen, insbesondere wenn Sie große Datendateien haben, hat aber keine Auswirkungen auf die Lesezeit.

Dies ist der Standardmodus.

Merge-on-Read

In diesem Modus hat die Schreibgeschwindigkeit Vorrang und die Lesezeit wird leicht beeinträchtigt.

Wenn Sie einen Aktualisierungs-, Lösch- oder Zusammenführungsvorgang durchführen, erstellt Ihre Compute Engine eine Löschdatei, die nur Informationen über die geänderten Zeilen enthält.

Wenn Sie aus einer Tabelle lesen, führt Ihr Abfrageprogramm die Löschdateien mit den Datendateien zusammen. Das Zusammenführen kann die Lesezeit erhöhen. Sie können jedoch die Leseleistung optimieren, indem Sie eine regelmäßige Verdichtung und Tabellenpflege einplanen.

Weitere Informationen über Änderungen auf Zeilenebene für Iceberg finden Sie unter Löschungen auf Zeilenebene in der Apache Iceberg-Dokumentation.

Hinweise und Einschränkungen

Beachten Sie das Folgende, wenn Sie Löschungen auf Zeilenebene mit extern verwalteten Iceberg-Tabellen verwenden:

  • Snowflake unterstützt nur das Löschen von Positionen.

  • Um die beste Leseleistung zu erzielen, wenn Sie Löschungen auf Zeilenebene verwenden, führen Sie regelmäßig eine Verdichtung und Tabellenpflege durch, um alte Löschdateien zu entfernen. Weitere Informationen dazu finden Sie unter Tabellen warten, die einen externen Katalog verwenden.

  • Die automatische Aktualisierung wird derzeit nicht unterstützt, wenn Sie Positionslöschungen verwenden.

  • Übermäßige Positionslöschungen, insbesondere verwaiste Positionslöschungen, können das Erstellen von Tabellen und Aktualisierungsoperationen verhindern. Um dieses Problem zu vermeiden, führen Sie eine Tabellenwartung durch, um zusätzliche Positionslöschungen zu entfernen.

    Die zu verwendende Methode zur Wartung der Tabellen hängt von Ihrer externen Iceberg-Engine ab. Sie können zum Beispiel die rewrite_data_files-Methode für Spark mit der Option delete-file-threshold oder rewrite-all verwenden. Weitere Informationen dazu finden Sie unter rewrite_data_files in der Apache Iceberg™-Dokumentation.

Zieldateigröße festlegen

Um die Abfrageleistung für externe Iceberg-Engines wie Delta, Spark oder Trino zu verbessern, können Sie eine Zieldateigröße sowohl für von Snowflake verwaltete als auch für extern verwaltete Iceberg-Tabellen mit Schreibunterstützung konfigurieren. Sie können entweder eine bestimmte Größe festlegen (16MB, 32MB, 64MB oder 128MB), oder Sie verwenden die AUTO-Option. AUTO funktioniert je nach Tabellentyp unterschiedlich:

  • Von Snowflake verwaltete Tabellen: AUTO gibt an, dass Snowflake die Dateigröße für die Tabelle auf Grundlage von Tabellenmerkmalen wie Größe, DML-Muster, Datenaufnahme-Workload und Clustering-Konfiguration auswählen soll. Snowflake passt die Dateigröße automatisch an, beginnend mit 16 MB, um die Leistung beim Lesen und Schreiben in Snowflake zu verbessern.

  • Extern verwaltete Tabellen: AUTO gibt an, dass Snowflake aggressiv auf eine größere Dateigröße skalieren soll.

Sie können die Zieldateigröße festlegen, wenn Sie eine Iceberg-Tabelle erstellen, oder den Befehl ALTER ICEBERG TABLE ausführen, um die Zieldateigröße für eine bestehende Iceberg-Tabelle zu ändern. Snowflake versucht, beim Schreiben von Parquet-Dateien für eine Tabelle die Dateigrößen nahe an der Zielgröße zu halten.

Nachdem Sie eine Zieldateigröße festgelegt haben, beginnt Snowflake sofort, größere Dateien für die neuen DML-Operationen (Data Manipulation Language) zu erstellen. Die Tabellenwartungsoperationen von Snowflake ändern die vorhandenen Tabellendateien asynchron entsprechend der Größe der Zieldatei.

Das folgende Beispiel verwendet TARGET_FILE_SIZE, um eine Zieldateigröße von 128 MB für eine von Snowflake verwaltete Tabelle festzulegen:

CREATE ICEBERG TABLE my_iceberg_table (col1 INT)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  TARGET_FILE_SIZE = '128MB';
Copy

Alternativ können Sie auch ALTER ICEBERG TABLE verwenden, um die TARGET_FILE_SIZE-Eigenschaft für eine bestehende Tabelle festzulegen:

ALTER ICEBERG TABLE my_iceberg_table
  SET TARGET_FILE_SIZE = '32MB';
Copy

Verwenden Sie zum Überprüfen des Werts der Eigenschaft TARGET_FILE_SIZE für eine Tabelle den Befehl SHOW PARAMETERS:

SHOW PARAMETERS LIKE 'target_file_size' FOR my_iceberg_table;
Copy

Tabellen warten, die einen externen Katalog verwenden

Sie können Wartungsoperationen auf Iceberg-Tabellen ausführen, die einen externen Katalog verwenden.

Die Wartungsoperationen umfassen Folgendes:

  • Snapshots ablaufen lassen

  • Alte Metadaten-Dateien entfernen

  • Datendateien komprimieren

Wichtig

Um Ihre Iceberg-Tabelle mit externen Änderungen synchron zu halten, ist es wichtig, dass Sie Ihren Snowflake-Aktualisierungsplan mit der Tabellenwartung abstimmen. Aktualisieren Sie die Tabelle jedes Mal, wenn Sie eine Wartungsoperation ausführen.

Informationen zur Wartung von Iceberg-Tabellen, die nicht von Snowflake verwaltet werden, finden Sie in der Apache Iceberg-Dokumentation unter Wartung.

Tabellen-Metadaten aktualisieren

Wenn Sie einen externen Iceberg-Katalog verwenden, können Sie die Metadaten der Tabelle mit dem Befehl ALTER ICEBERG TABLE … REFRESH aktualisieren. Durch das Aktualisieren der Tabellenmetadaten werden die Metadaten mit den jüngsten Tabellenänderungen synchronisiert.

Bemerkung

Wir empfehlen die Einrichtung der automatischen Aktualisierung für unterstützte, extern verwaltete Tabellen.

Aktualisieren der Metadaten für eine Tabelle

Das folgende Beispiel aktualisiert manuell die Metadaten für eine Tabelle, die einen externen Katalog verwendet (z. B. AWS Glue oder Delta). Durch das Aktualisieren der Tabelle wird die Tabelle mit allen Änderungen, die im Remote-Katalog vorgenommen wurden, synchronisiert.

Bei diesem Typ von Iceberg-Tabelle geben Sie im Befehl keinen Pfad zur Metadatendatei an.

ALTER ICEBERG TABLE my_iceberg_table REFRESH;
Copy

Um eine Tabelle automatisch zu aktualisieren, können Sie automatische Aktualisierung einrichten. Verwenden Sie den Befehl ALTER ICEBERG TABLE.

Beispiel:

ALTER ICEBERG TABLE my_iceberg_table SET AUTO_REFRESH = TRUE;
Copy

Aktualisieren Sie die Metadaten für eine aus Iceberg-Dateien erstellte Tabelle

Im folgenden Beispiel wird eine Tabelle manuell aktualisiert, die aus Iceberg-Metadatendateien in einem externen Cloudspeicherort erstellt wurde, wobei der relative Pfad zu einer Metadatendatei ohne Schrägstrich (/) angegeben wird. Die Metadatendatei definiert die Daten in der Tabelle nach dem Aktualisieren.

ALTER ICEBERG TABLE my_iceberg_table REFRESH 'metadata/v1.metadata.json';
Copy

Speichermetriken abrufen

Snowflake stellt Ihrem Konto keine Kosten für die Speicherung der Iceberg-Tabellen in Rechnung. Sie können jedoch nachvollziehen, wie viel Speicherplatz eine Iceberg-Tabelle belegt, indem Sie die Ansichten TABLE_STORAGE_METRICS und TABLES im Schema Snowflake Information Schema oder Account Usage abfragen.

Die folgende Beispielabfrage verbindet die Ansicht ACCOUNT_USAGE.TABLE_STORAGE_METRICS mit der Ansicht ACCOUNT_USAGE.TABLES und filtert nach der Spalte TABLES.IS_ICEBERG.

SELECT metrics.* FROM
  snowflake.account_usage.table_storage_metrics metrics
  INNER JOIN snowflake.account_usage.tables tables
  ON (
    metrics.id = tables.table_id
    AND metrics.table_schema_id = tables.table_schema_id
    AND metrics.table_catalog_id = tables.table_catalog_id
  )
  WHERE tables.is_iceberg='YES';
Copy