Charger des données dans les tables Apache Iceberg™

Snowflake prend en charge les options suivantes pour le chargement des données dans une table Iceberg gérée par Snowflake :

Formats de fichier

Vous pouvez charger des données dans une table Iceberg à partir de fichiers dans n’importe lequel des formats pris en charge pour le chargement dans les tables Snowflake standard.

Pour CSV, JSON, Avro et ORC, Snowflake convertit les données des formats de fichiers non Parquet en fichiers Parquet Iceberg et stocke les données dans l’emplacement de base de la table Iceberg. Seule l’option par défaut LOAD_MODE = FULL_INGEST est prise en charge pour ces scénarios de chargement de format de fichier qui nécessitent une conversion de type.

Pour les fichiers Parquet d’Apache, Snowflake charge les données directement dans les colonnes des tables et vous permet de choisir parmi les options LOAD_MODE suivantes :

  • FULL_INGEST : Analyse les fichiers et réécrit les données Parquet sous l’emplacement de base de la table Iceberg.

  • ADD_FILES_COPY : Le binaire copie les fichiers Parquet Apache compatibles avec Iceberg qui ne sont pas enregistrés dans un catalogue Iceberg dans l’emplacement de base de la table Iceberg, puis enregistre les fichiers dans la table Iceberg.

Pour plus d’informations, voir COPY INTO <table>.

Exemple : Charger des fichiers Parquet compatibles avec Iceberg

Cet exemple explique comment créer une table Iceberg et y charger des données à partir de fichiers de données Parquet compatibles avec Iceberg dans une zone de préparation externe.

À des fins de démonstration, cet exemple utilise les ressources suivantes :

  • Un volume externe nommé iceberg_ingest_vol. Pour créer un volume externe, voir Configurer un volume externe.

  • Une zone de préparation externe nommée my_parquet_stage contenant des fichiers Parquet compatibles avec Iceberg. Pour créer une zone de préparation externe, voir CREATE STAGE.

  1. Créez un objet de format de fichier qui décrit les fichiers Parquet mis en zone de préparation, en utilisant la configuration requise pour copier les données Parquet compatibles avec Iceberg (TYPE = PARQUET USE_VECTORIZED_SCANNER = TRUE) :

    CREATE OR REPLACE FILE FORMAT my_parquet_format
      TYPE = PARQUET
      USE_VECTORIZED_SCANNER = TRUE;
    
    Copy
  2. Créez une table Iceberg gérée par Snowflake, en définissant des colonnes dont les types de données sont compatibles avec les types de données du fichier Parquet source :

    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

    Note

    L’instruction d’exemple spécifie les types de données Iceberg qui correspondent aux types de données Snowflake. Pour plus d’informations, voir Types de données des tables Apache Iceberg™.

  3. Utilisez une instruction COPY INTO pour charger les données des fichiers Parquet en zone de préparation (situés directement sous le chemin de l’URL de la zone de préparation) dans la table Iceberg :

    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

    Note

    L’exemple spécifie LOAD_MODE = ADD_FILES_COPY, ce qui indique à Snowflake de copier les fichiers dans l’emplacement de votre volume externe, puis d’enregistrer les fichiers dans la table.

    Cette option permet d’éviter les frais de fichiers, car Snowflake ne scanne pas les fichiers Parquet source et ne réécrit pas les données dans de nouveaux fichiers Parquet.

    Sortie :

    +---------------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
    | 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. Interrogez la table :

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

    Sortie :

    +-----------+--------------------+--------------+
    | 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    |
    +-----------+--------------------+--------------+