Tables Apache Iceberg™ : Prise en charge de Apache Iceberg™ v3 (Prévisualisation)

Cette prévisualisation introduit la prise en charge de la v3 de la spécification Apache Iceberg™, mais avec certaines considérations et limitations. Sauf indication contraire, les tables Iceberg gérées par Snowflake et celles gérées en externe sont prises en charge dans cette prévisualisation.

Fonctionnalités Iceberg v3 prises en charge

Cette section répertorie les fonctionnalités Iceberg v3 prises en charge dans cette prévisualisation.

Types de données

Les types de données v3 suivants sont pris en charge dans la prévisualisation publique :

  • geography

  • geometry

  • nanosecond

  • variant

Pour plus d’informations, voir Types de données Iceberg v3.

Valeurs par défaut

Consultez Valeurs par défaut.

Vecteurs de suppression

Consultez Vecteurs de suppression.

Lignée de lignes

Consultez Lignée de lignes.

Configurer la version Iceberg par défaut

Les tables Iceberg ont par nature une version de format à laquelle elles sont conformes. Pour les tables Iceberg gérées en externe dans une base de données Snowflake standard, Snowflake récupère cette version à partir des métadonnées de la table.

Pour les tables Iceberg suivantes, le propriétaire de la table doit spécifier la version Iceberg à laquelle la table doit être conforme :

La version de format Iceberg par défaut du système dans Snowflake est la v2, mais vous pouvez la définir sur la v3, si nécessaire. Pour définir la version Iceberg sur la v3, effectuez l’une des actions suivantes :

  • Utilisez le paramètre ICEBERG_VERSION_DEFAULT pour définir la version Iceberg sur 3 au niveau du compte, de la base de données ou du schéma. Pour plus d’informations, voir ICEBERG_VERSION_DEFAULT.

  • Spécifiez ICEBERG_VERSION = 3 dans votre instruction CREATE ICEBERG TABLE.

    Note

    Si vous ne spécifiez pas de version Iceberg lorsque vous créez une table Iceberg, la table utilise par défaut la version Iceberg définie pour le schéma, la base de données ou le compte. Le schéma est prioritaire sur la base de données, et la base de données est prioritaire sur le compte.

Prudence

Avant d’utiliser d’autres moteurs pour mettre à niveau une version de format de tables Iceberg dans les propriétés de table vers la v3, assurez-vous que la table n’est pas utilisée par des moteurs ou des applications qui ne prennent pas encore en charge la v3. La rétrogradation des versions de format n’est pas prise en charge dans la spécification Apache Iceberg. Par conséquent, tous les lecteurs et rédacteurs doivent prendre en charge la v3. La version par défaut des tables Iceberg dans Snowflake est la v2, qui peut être configurée en v3 si nécessaire. L’utilisation de Snowflake pour effectuer des mises à niveau de version sur place n’est pas prise en charge pour le moment.

Notes sur l’utilisation

  • Pour modifier le paramètre ICEBERG_VERSION_DEFAULT au niveau du compte, vous devez être un administrateur de compte. En d’autres termes, vous devez être un utilisateur disposant du rôle ACCOUNTADMIN.

  • Pour modifier le paramètre ICEBERG_VERSION_DEFAULT au niveau de la base de données ou du schéma, le rôle utilisé pour effectuer l’opération doit disposer du privilège OWNERSHIP sur la base de données ou le schéma respectif.

Exemples

Spécifiez que les nouvelles tables Iceberg dans la base de données my_db doivent être créées à l’aide de la v3 :

ALTER DATABASE my_db SET ICEBERG_VERSION_DEFAULT=3;
Copy

Créez une nouvelle table Iceberg gérée en externe avec la v3. Les définitions de colonnes incluses avec la commande indiquent qu’une nouvelle table sera créée, ou qu’une table existante sera remplacée, dans le catalogue distant. La table est correctement créée, car il s’agit d’une nouvelle table qui n’a pas de version existante.

CREATE OR REPLACE ICEBERG TABLE my_iceberg_v3_table (
    boolean_col boolean,
    int_col int,
    long_col long,
  )
  CATALOG='my_catalog_integration'
  ICEBERG_VERSION=3;
Copy

Créez une table Iceberg gérée en externe avec la v3 depuis une table existante avec des métadonnées Iceberg. L’absence de définitions de colonne ou de version de format dans cet exemple indique que cette table existe déjà et que la spécification de la colonne et la version de format seront déduites des métadonnées Iceberg du catalogue distant. Cet exemple utilise des identifiants de connexion distribués par catalogue, de sorte que le paramètre EXTERNAL_VOLUME est exclu de l’instruction CREATE ICEBERG TABLE :

CREATE OR REPLACE ICEBERG TABLE my_iceberg_v3_table
  CATALOG = 'my_catalog_integration'
  CATALOG_TABLE_NAME = 'my_table'
  AUTO_REFRESH = TRUE;
Copy

Note

Vous ne pouvez pas utiliser la commande ALTER ICEBERG TABLE pour modifier la version de format d’une table existante.

Obtenir la version de format pour les tables Iceberg

  • L’exemple suivant montre comment obtenir la version Iceberg pour une table spécifique :

    SHOW PARAMETERS LIKE 'ICEBERG_VERSION' IN TABLE my_v3_iceberg_table;
    
    Copy

    Sortie :

    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    | key             | value | default | level | description                                       | type   |
    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    | ICEBERG_VERSION | 3     | 2       | TABLE | Specifies the Iceberg table format version to ... | NUMBER |
    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    
  • L’exemple suivant montre comment obtenir la version Iceberg d’une table spécifique à l’aide de la fonction GET_DDL pour récupérer la définition de la table Iceberg :

    SELECT GET_DDL('ICEBERG_TABLE', 'my_v3_iceberg_table');
    
    Copy

    Sortie :

     CREATE ICEBERG TABLE my_v3_iceberg_table (
      record VARIANT,
      event_timestamp TIMESTAMP_LTZ(6)
    )
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'my_external_volume'
      BASE_LOCATION = 'my_iceberg_table'
      ICEBERG_VERSION = 3;
    

Considérations et limites des fonctionnalités Iceberg v3

Tenez compte des informations suivantes lorsque vous utilisez les fonctionnalités Iceberg v3 :

Fonctionnalités Snowflake non prises en charge

Les fonctionnalités suivantes de Snowflake ne sont pas prises en charge dans cette prévisualisation pour Iceberg v3 :

  • Flux d’ajout uniquement sur les tables Iceberg gérées en externe

  • Projets dbt sur Snowflake

  • Inférence de schéma

  • Snowpipe Streaming classic architecture

  • Régions SnowGov

  • Pour les tables qui utilisent un catalogue externe, vous ne pouvez pas créer de tables Iceberg v3 avec des colonnes de type structuré, qui incluent OBJECT, ARRAY ou MAP. Par exemple, vous ne pouvez pas utiliser CREATE ICEBERG TABLE … AS SELECT (CTAS) pour créer une table Iceberg v3 gérée en externe avec des colonnes de type structuré.

    Vous pouvez créer des tables Iceberg v3 gérées par Snowflake avec des colonnes de type structuré.

  • Mise à niveau sur place d’une table Iceberg gérée par Snowflake de la v2 vers la v3, qui inclut le clonage d’une table v2, puis la mise à niveau du clone vers la v3

    Important

    Si vous utilisez Apache Spark pour mettre à niveau une table Iceberg gérée en externe de la v2 vers la v3, vous devez utiliser une validation qui crée un nouvel instantané, comme des opérations DML. Dans le cas contraire, si la version de format est mise à jour dans les propriétés de la table sans nouvel instantané, l’actualisation manuelle et automatique de la table échouera jusqu’à ce qu’un nouvel instantané soit créé.

    L’exemple suivant utilise Apache Spark pour mettre à niveau une table Iceberg gérée en externe de la v2 vers la v3 :

    ALTER TABLE table_name SET TBLPROPERTIES('format-version'='3');
    
    Copy

Note

  • La liste des fonctionnalités non prises en charge n’est pas finalisée et est susceptible d’être modifiée à l’avenir. La liste sera mise à jour, si nécessaire, pour refléter les dernières fonctionnalités non prises en charge.

  • Pour connaître les considérations et les limitations spécifiques à une fonctionnalité v3, consultez le chapitre des fonctionnalités pour une fonctionnalité.

Fonctions Snowflake prises en charge

Les fonctionnalités non répertoriées dans la section Fonctionnalités Snowflake non prises en charge sont prises en charge. Les fonctionnalités prises en charge sont les suivantes :

Fonctionnalité

Remarques

Exécution automatique pour les annonces

Actualisation automatique

Intégrations de catalogue

Bases de données liées à un catalogue

Clonage

Clustering

Iceberg v3 géré par Snowflake uniquement.

Conversion de tables v3 gérées en externe en tables gérées par Snowflake

Prise en charge avec les considérations suivantes :

  • Le partitionnement Iceberg reste intact lorsque vous convertissez une table Iceberg v3.

  • Avant la conversion, Snowflake ne supprime jamais aucune métadonnée, liste de manifestes ou manifestes créés depuis votre stockage externe.

  • Pendant la conversion, Snowflake ne réécrit aucune métadonnée ni aucun fichier de données Parquet.

  • Après la conversion, Snowflake est le catalogue qui est entièrement responsable de la gestion du cycle de vie de la table. Snowflake supprime les métadonnées, les listes de manifestes, les manifestes et les fichiers de données, créés avant ou après la conversion de votre stockage externe après leur expiration et la transmission de la fenêtre de conservation.

COPY INTO <table>

LOAD_MODE = FULL_INGEST ou ADD_FILESCOPY sont pris en charge avec les considérations suivantes :

  • Pour charger les colonnes de métadonnées de lignée de lignes dans des fichiers Parquet (_row_id et:code:_last_updated_sequence_number), vous devez utiliser l’option FULL_INGEST. Les autres méthodes LOAD_MODE ne sont pas prises en charge. Cependant, les fichiers Parquet contenant des lignées de lignes font probablement déjà partie d’une table Iceberg v3. L’enregistrement de fichiers Parquet en utilisant ADD_FILES_COPY n’est pas recommandé si ces fichiers font déjà partie d’une autre table Iceberg. La bonne pratique pour convertir des tables Iceberg gérées en externe en tables Iceberg gérées par Snowflake sans réécrire les fichiers consiste à utiliser la commande ALTER ICEBERG TABLE … CONVERT TO MANAGED.

COPY INTO <emplacement>

Prise en charge avec les limitations suivantes :

  • VARIANT, GEOMETRY et GEOGRAPHY sont déchargés en tant que chaînes encodées en JSON.

  • TIMESTAMP_NTZ(9) est déchargé en millisecondes, et non en nanosecondes.

  • TIMESTAMP_LTZ(9), ARRAY, OBJECT et MAP doivent être converties en d’autres types de données.

Salles blanches de données

Lignée de données

Politiques de protection des données

Les politiques de protection des données suivantes sont prises en charge :

  • Politiques de masquage

  • Politiques d’accès aux lignes

  • Politiques de projection

  • Politiques d’agrégation

  • Politiques de confidentialité

  • Politiques de jointure

Application de la politique de protection des données à partir d’Apache Spark

Supervision de la qualité des données

Tables dynamiques

Écrivez une table Iceberg v3 gérée en externe comme cible d’une table dynamique.

API Catalog REST Horizon Iceberg

LOB (grand objet)

Vues matérialisées

Balisage d’objets

Accélération de requête.

Replication

Optimisation de la recherche

Vues sécurisées

Classification des données sensibles

Taille du fichier cible

Partitionnement Iceberg à un seul argument

Les tables partitionnées ne peuvent pas également écrire de vecteurs de suppression. Seule la copie sur écriture est prise en charge pour les tables partitionnées.

Connecteur Snowflake pour Kafka

Versions 4.0 ou plus récentes.

Snowpark

1.33.0 ou plus récente.

Méthode d’API Snowpark pandas to_iceberg

Uniquement prise en charge pour Iceberg v3 lorsqueICEBERG_VERSION_DEFAULT est défini sur le compte, la base de données ou le schéma. Si ICEBERG_VERSION = 3 est défini au niveau de la table, la méthode d’API Snowpark pandas to_iceberg n’est pas prise en charge.

Snowpark Connect pour Apache Spark

L’écriture de dataframes dans des tables Iceberg v3 existantes en utilisant une méthode d’ajout ou de réécriture est prise en charge. La création d’une nouvelle table Iceberg v3 n’est pas prise en charge.

Snowpipe

Snowpipe Streaming high-performance architecture

Partage

Flux

  • Les flux d’ajout uniquement et les flux standard sont pris en charge sur les tables Iceberg v3 gérées par Snowflake.

  • Les flux d’insertion uniquement et les flux standard sont pris en charge sur les tables Iceberg v3 gérées en externe.

    • Pour que les flux standard produisent les bons résultats, le moteur externe doit écrire dans les tables Iceberg v3 par rapport à la spécification Iceberg v3. Plus précisément, les lignes nouvellement insérées devraient avoir _row_id=NULL. Les lignes qui sont copiées pendant la copie sur écriture doivent maintenir l’_row_id.

    • MAX_DATA_EXTENSION_TIME_IN_DAYS ne fonctionne pas sur les tables Iceberg v3 gérées en externe.

  • Lorsque des DMLs sont validés sur des transactions à plusieurs instructions, les flux d’ajout uniquement sur les tables Iceberg v3 ont une sémantique différente de celle des tables Iceberg v2 :

    • Sur Iceberg v2, pour les flux d’ajout uniquement, si une ligne est ajoutée puis supprimée dans une transaction à plusieurs instructions, cette ligne est considérée comme une insertion.

    • Sur Iceberg v3, pour les flux d’ajout uniquement, cette ligne n’est pas traitée comme une insertion.

Optimisation de la table

Fonctionnalités Iceberg v3 non prises en charge

Les fonctionnalités suivantes de la spécification Iceberg v3 ne sont pas prises en charge :

  • Variante imbriquée

  • Transformations multi-arguments pour le partitionnement et le tri

  • Clés de chiffrement de table

  • Type de données UNKNOWN

Exemples : Prise en charge de la v3 avec les fonctionnalités Snowflake existantes

Cette section présente des exemples des fonctionnalités existantes de Snowflake prises en charge avec la v3. Une annonce de fonctionnalités comprend un exemple pour une table gérée par Snowflake et une table gérée en externe, si elles sont prises en charge.

Pour obtenir la liste complète des fonctionnalités Snowflake prises en charge dans cette prévisualisation pour Iceberg v3, consultez Fonctionnalités Snowflake prises en charge.

Créer une table Iceberg v3

L’exemple suivant crée une table Apache Iceberg™ gérée par Snowflake conforme à la v3 de la spécification Apache Iceberg™ :

CREATE ICEBERG TABLE my_v3_iceberg_table (
  record VARIANT,
  event_timestamp TIMESTAMP_LTZ(6)
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  ICEBERG_VERSION = 3;
Copy

L’exemple suivant crée une table Apache Iceberg™ qui utilise un catalogue REST Iceberg distant et est conforme à la v3 de la spécification Apache Iceberg™ :

Note

Vous n’avez pas besoin de spécifier ICEBERG_VERSION = 3 avec la commande, car la version de format est déjà définie dans les métadonnées du catalogue externe, de sorte que Snowflake récupère cette version à partir des métadonnées.

CREATE ICEBERG TABLE my_v3_iceberg_table
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'my_rest_catalog_integration'
  CATALOG_TABLE_NAME = 'my_remote_table'
  AUTO_REFRESH = TRUE;
Copy

L’exemple suivant crée une table Iceberg accessible en écriture dans une base de données liée à un catalogue avec des définitions de colonnes et conforme à la v3 de la spécification Apache Iceberg™ :

USE DATABASE my_catalog_linked_db;

USE SCHEMA 'my_namespace';

CREATE OR REPLACE ICEBERG TABLE my_iceberg_table (
  first_name string,
  last_name string,
  amount int,
  create_date date
)
  ICEBERG_VERSION = 3;
Copy

Écrire dans une table Iceberg v3

Les commandes DML INSERT, UPDATE, DELETE, MERGE, TRUNCATE TABLE et COPY INTO sont prises en charge pour l’écriture sur des tables Iceberg v3 gérées par Snowflake et gérées en externe :

L’exemple suivant insère une ligne dans une table Apache Iceberg™ conforme à la v3 de la spécification de table Apache Iceberg™ :

INSERT INTO my_v3_iceberg_table (id, payload) VALUES (1, PARSE_JSON('{"name": "Alice", "age": 30}'));
Copy

L’exemple suivant charge des fichiers dans une table Apache Iceberg™ conforme à la v3 de la spécification de table Apache Iceberg™ :

COPY INTO my_v3_iceberg_table
  FROM @my_json_stage
  FILE_FORMAT = 'my_json_format'
  MATCH_BY_COLUMN_NAME = CASE_SENSITIVE;
Copy

Charger des données en utilisant Snowpipe

L’exemple suivant charge des données à partir de fichiers pour les tables Iceberg v3, pour les tables gérées par Snowflake et les tables gérées en externe :

CREATE PIPE mypipe
  AUTO_INGEST = TRUE
  INTEGRATION = 'MYINT'
  AS
  COPY INTO snowpipe_db.public.my_v3_iceberg_table
  FROM @snowpipe_db.public.mystage
  FILE_FORMAT = (TYPE = 'JSON');
Copy

Note

Snowflake prend en charge des fonctionnalités d’écriture supplémentaires pour Iceberg v3. Pour cette liste, consultez Considérations et limites pour les fonctionnalités Iceberg v3, puis consultez la liste des fonctionnalités Snowflake prises en charge.

Créer une table Iceberg dynamique v3

L’exemple suivant écrit une table Iceberg v3 gérée par Snowflake comme sortie d’une table dynamique :

CREATE DYNAMIC ICEBERG TABLE my_dynamic_iceberg_v3_table (
    num_orders NUMBER(10,0),
    order_day
  )
  TARGET_LAG = '20 minutes'
  WAREHOUSE = my_warehouse
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'SNOWFLAKE'
  BASE_LOCATION = 'my_dynamic_iceberg_v3_table'
  ICEBERG_VERSION = 3
  AS
    SELECT
        COUNT(DISTINCT order_id)
        DATE_TRUNC('DAY', order_timestamp_ns) AS order_day
      FROM staging_v3_iceberg_table;
Copy

Note

L’écriture d’une table Iceberg v2 ou v3 gérée en externe comme cible d’une table dynamique n’est pas prise en charge. La sortie d’une table Iceberg dynamique ne peut être gérée que par Snowflake.

Interroger une table Iceberg v3

L’exemple suivant interroge une table Iceberg v3 gérée par Snowflake ou en externe :

SELECT * FROM MY_DB.MY_SCHEMA.MY_ICEBERG_V3_TABLE;
Copy