Laden von Daten in Apache Iceberg™-Tabellen¶
Snowflake unterstützt die folgenden Optionen zum Laden von Daten in eine von Snowflake verwaltete Iceberg-Tabelle:
- Verwendung von Snowpipe Streaming Classic mit Apache Iceberg™-Tabellen 
- Verwendung des Snowflake Connector für Kafka mit Apache Iceberg™-Tabellen 
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.
- 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; 
- 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/'; - 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. 
- 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; - Bemerkung - Das Beispiel gibt - LOAD_MODE = ADD_FILES_COPYan, 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 | +---------------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+ 
- Fragen Sie die Tabelle ab: - SELECT c_custkey, c_name, c_mktsegment FROM customer_iceberg_ingest LIMIT 10; - 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 | +-----------+--------------------+--------------+ 
Beispiel: Laden Sie Iceberg-kompatible Parquet-Dateien in die mit der Funktion INFER_SCHEMA erstellte Tabelle¶
Dieses Beispiel zeigt Ihnen, wie Sie Folgendes tun können:
- Erstellen Sie eine Apache Iceberg™-Tabelle mit der Funktion INFER_SCHEMA. 
- Laden Sie Daten aus Iceberg-kompatiblen Parquet-Datendateien in einem externen Stagingbereich. 
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.
- 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; 
- Abrufen der Spaltendefinitionen für Parquet-Dateien im Stagingbereich - my_parquet_stage:- SELECT * FROM TABLE( INFER_SCHEMA( LOCATION=>'@my_parquet_stage/customer_iceberg/files-to-ingest/' , FILE_FORMAT=>'my_parquet_format' , KIND => 'ICEBERG' ) ); - Ausgabe: - +-------------+---------+----------+---------------------+------------------------------------------------------+----------+ | COLUMN_NAME | TYPE | NULLABLE | EXPRESSION | FILENAMES | ORDER_ID | |-------------+---------+----------+---------------------+------------------------------------------------------|----------+ | id | INT | False | $1:id::INT | customer_iceberg/files-to-ingest/customers.parquet | 0 | | custnum | INT | False | $1:custnum::INT | customer_iceberg/files-to-ingest/customers.parquet | 1 | +-------------+---------+----------+---------------------+------------------------------------------------------+----------+ 
- Erstellen Sie eine Iceberg-Tabelle unter Verwendung des gefundenen Schemas. - CREATE ICEBERG TABLE myicebergtable USING TEMPLATE ( SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*)) WITHIN GROUP (ORDER BY order_id) FROM TABLE( INFER_SCHEMA( LOCATION=>'@my_parquet_stage/customer_iceberg/files-to-ingest/', FILE_FORMAT=>'my_parquet_format', KIND => 'ICEBERG' ) )) ... {rest of the ICEBERG options} ; - Bemerkung - Die Verwendung von - *für- ARRAY_AGG(OBJECT_CONSTRUCT())kann zu einem Fehler führen, wenn das zurückgegebene Ergebnis größer ist als 16MB. Wir empfehlen, die Verwendung von- *für größere Resultsets zu vermeiden und nur die erforderlichen Spalten- COLUMN NAME,- TYPEund- NULLABLEfür die Abfrage zu verwenden. Die optionale Spalte- ORDER_IDkann bei Verwendung von- WITHIN GROUP (ORDER BY order_id)hinzugefügt werden.
- Verwenden Sie eine COPY INTO-Anweisung, um die Daten aus den Stagingbereichen der Parquet-Dateien in die Iceberg-Tabelle zu laden: - COPY INTO myicebergtable FROM @my_parquet_stage/customer_iceberg/files-to-ingest/ FILE_FORMAT = 'my_parquet_format' LOAD_MODE = ADD_FILES_COPY MATCH_BY_COLUMN_NAME = CASE_SENSITIVE; - Bemerkung - Das Beispiel gibt - LOAD_MODE = ADD_FILES_COPYan, 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/customer_iceberg/files-to-ingest/customers.parquet | LOADED | 15000 | 15000 | 0 | 0 | NULL | NULL | NULL | NULL | +---------------------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+ 
- Nachdem Sie die Daten geladen haben, fragen Sie die Tabelle ab: - SELECT id, custnum FROM myicebergtable LIMIT 10; - Ausgabe: - +-----------+---------+ | id | custnum | |-----------+---------+ | 1 | 75001 | | 2 | 75002 | | 3 | 75003 | | 4 | 75004 | | 5 | 75005 | | 6 | 75006 | | 7 | 75007 | | 8 | 75008 | | 9 | 75009 | | 10 | 75010 | +-----------+---------+