Laden von Daten in Apache Iceberg™-Tabellen

Snowflake unterstützt die folgenden Optionen zum Laden von Daten in eine von Snowflake verwaltete Iceberg-Tabelle:

Dateiformate

Sie können Daten in eine Iceberg-Tabelle aus Dateien in jedem der Formate laden, die für das Laden in Standard-Snowflake-Tabellen unterstützt werden.

Für CSV, JSON, Avro und ORC konvertiert Snowflake die Daten aus Nicht-Parquet-Dateiformaten in Iceberg-Parquet-Dateien und speichert die Daten am Basisspeicherort der Iceberg-Tabelle. Für diese Dateiformat-Ladeszenarien, die eine Typkonvertierung erfordern, wird nur die Standardoption LOAD_MODE = FULL_INGEST unterstützt.

Bei Apache Parquet-Dateien lädt Snowflake die Daten direkt in die Tabellenspalten und lässt Ihnen die Wahl zwischen den folgenden LOAD_MODE Optionen:

  • FULL_INGEST: Durchsucht die Dateien und schreibt die Parquet-Daten am Basisspeicherort der Iceberg-Tabelle neu.

  • ADD_FILES_COPY: Kopiert die Iceberg-kompatiblen Apache Parquet-Dateien, die nicht in einem Iceberg-Katalog registriert sind, binär in den Basisspeicherort der Iceberg-Tabelle und registriert die Dateien dann in der Iceberg-Tabelle.

Weitere Informationen dazu finden Sie unter COPY INTO <Tabelle>.

Beispiel: Iceberg-kompatible Parquet-Dateien laden

In diesem Beispiel erfahren Sie, wie Sie eine Iceberg-Tabelle erstellen und dann Daten aus Iceberg-kompatiblen Parquet-Datendateien im Stagingbereich in die Tabelle laden.

Zu Demonstrationszwecken verwendet dieses Beispiel die folgenden Ressourcen:

  • Ein externes Volume mit dem Namen iceberg_ingest_vol. Um ein externes Volume zu erstellen, siehe Externes Volume konfigurieren.

  • Ein externer Stagingbereich namens my_parquet_stage, der mit Iceberg kompatible Parquet-Dateien enthält. Um einen externen Stagingbereich zu erstellen, siehe CREATE STAGE.

  1. Erstellen Sie ein Dateiformatobjekt, das die im Stagingbereich bereitgestellten Parquet-Dateien beschreibt, unter Verwendung der erforderlichen Konfiguration für das Kopieren Iceberg-kompatibler Parquet-Daten (TYPE = PARQUET USE_VECTORIZED_SCANNER = TRUE):

    CREATE OR REPLACE FILE FORMAT my_parquet_format
      TYPE = PARQUET
      USE_VECTORIZED_SCANNER = TRUE;
    
    Copy
  2. Erstellen Sie eine von Snowflake verwaltete Iceberg-Tabelle und definieren Sie Spalten mit Datentypen, die mit den Datentypen der Quell-Parquet-Datei kompatibel sind:

    CREATE OR REPLACE ICEBERG TABLE customer_iceberg_ingest (
      c_custkey INTEGER,
      c_name STRING,
      c_address STRING,
      c_nationkey INTEGER,
      c_phone STRING,
      c_acctbal INTEGER,
      c_mktsegment STRING,
      c_comment STRING
    )
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'iceberg_ingest_vol'
      BASE_LOCATION = 'customer_iceberg_ingest/';
    
    Copy

    Bemerkung

    Die Beispielanweisung gibt Iceberg-Datentypen an, die den Snowflake-Datentypen zugeordnet sind. Weitere Informationen dazu finden Sie unter Datentypen für Apache Iceberg™-Tabellen.

  3. Verwenden Sie eine COPY INTO-Anweisung, um die Daten aus den im Stagingbereich bereitgestellten Parquet-Dateien (die sich direkt unter der Stagingbereich-URL befinden) in die Iceberg-Tabelle zu laden:

    COPY INTO customer_iceberg_ingest
      FROM @my_parquet_stage
      FILE_FORMAT = 'my_parquet_format'
      LOAD_MODE = ADD_FILES_COPY
      PURGE = TRUE
      MATCH_BY_COLUMN_NAME = CASE_SENSITIVE;
    
    Copy

    Bemerkung

    Das Beispiel gibt LOAD_MODE = ADD_FILES_COPY an, wodurch Snowflake angewiesen wird, die Dateien in den Speicherort Ihres externen Volumes zu kopieren und sie dann in der Tabelle zu registrieren.

    Diese Option vermeidet Gebühren für Dateien, da Snowflake die Quell-Parquet-Dateien nicht scannt und die Daten in neue Parquet-Dateien umschreibt.

    Ausgabe:

    +---------------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
    | file                                                          | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
    |---------------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
    | my_parquet_stage/snow_af9mR2HShTY_AABspxOVwhc_0_1_008.parquet | LOADED |       15000 |       15000 |           0 |           0 | NULL        |             NULL |                  NULL | NULL                    |
    | my_parquet_stage/snow_af9mR2HShTY_AABspxOVwhc_0_1_006.parquet | LOADED |       15000 |       15000 |           0 |           0 | NULL        |             NULL |                  NULL | NULL                    |
    | my_parquet_stage/snow_af9mR2HShTY_AABspxOVwhc_0_1_005.parquet | LOADED |       15000 |       15000 |           0 |           0 | NULL        |             NULL |                  NULL | NULL                    |
    | my_parquet_stage/snow_af9mR2HShTY_AABspxOVwhc_0_1_002.parquet | LOADED |           5 |           5 |           0 |           0 | NULL        |             NULL |                  NULL | NULL                    |
    | my_parquet_stage/snow_af9mR2HShTY_AABspxOVwhc_0_1_010.parquet | LOADED |       15000 |       15000 |           0 |           0 | NULL        |             NULL |                  NULL | NULL                    |
    +---------------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
    
  4. Fragen Sie die Tabelle ab:

    SELECT
        c_custkey,
        c_name,
        c_mktsegment
      FROM customer_iceberg_ingest
      LIMIT 10;
    
    Copy

    Ausgabe:

    +-----------+--------------------+--------------+
    | C_CUSTKEY | C_NAME             | C_MKTSEGMENT |
    |-----------+--------------------+--------------|
    |     75001 | Customer#000075001 | FURNITURE    |
    |     75002 | Customer#000075002 | FURNITURE    |
    |     75003 | Customer#000075003 | MACHINERY    |
    |     75004 | Customer#000075004 | AUTOMOBILE   |
    |     75005 | Customer#000075005 | FURNITURE    |
    |         1 | Customer#000000001 | BUILDING     |
    |         2 | Customer#000000002 | AUTOMOBILE   |
    |         3 | Customer#000000003 | AUTOMOBILE   |
    |         4 | Customer#000000004 | MACHINERY    |
    |         5 | Customer#000000005 | HOUSEHOLD    |
    +-----------+--------------------+--------------+