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 mit von Snowflake verwalteten Tabellen verwenden

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

Bemerkung

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.

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 folgenden Features werden derzeit nicht unterstützt, wenn Sie Löschungen auf Zeilenebene verwenden:

    • Automatische Aktualisierung

    • Erstellung von materialisierten Ansichten, Suchoptimierung oder Streams auf dynamischen Tabellen, dynamischen Iceberg-Tabellen oder Iceberg-Tabellen mit vorhandenen Positionslöschungen.

    • Dynamische Tabellen

    • Aktualisierung des Iceberg-Snapshots mit Positionslöschungen auf dynamischen Tabellen, dynamischen Iceberg-Tabellen oder Iceberg-Tabellen mit entweder aktiven oder gelöschten materialisierten Ansichten, Suchoptimierung oder Streams.

    • Suchoptimierung

    • Streams

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