Gestion des tables Apache Iceberg™

Gestion des Tables Apache Iceberg™ dans Snowflake :

Vous pouvez également convertir une table Iceberg qui utilise un catalogue externe en une table qui utilise Snowflake comme catalogue Iceberg. Pour en savoir plus, voir Conversion d’une table Apache Iceberg™ pour utiliser Snowflake comme catalogue.

Interroger une table

Pour interroger une table Iceberg, un utilisateur doit se voir accorder les privilèges suivants ou en hériter :

  • Le privilège USAGE sur la base de données et le schéma qui contiennent la table

  • Le privilège SELECT sur la table

Vous pouvez interroger une table Iceberg à l’aide d’une instruction SELECT. Par exemple :

SELECT col1, col2 FROM my_iceberg_table;
Copy

Note

Outre Snowflake, vous pouvez également utiliser un moteur de requête externe pour interroger des tables Iceberg. Pour plus d’informations, voir Utiliser un moteur de requête externe avec des tables Apache Iceberg™.

Utiliser les commandes DML

Les tables Iceberg qui utilisent Snowflake comme catalogue prennent intégralement en charge Commandes DML (Langage de manipulation de données), y compris ce qui suit :

Les tables gérées par Snowflake prennent également en charge un chargement en masse efficace grâce à des fonctions telles que COPY INTO <table> et Snowpipe. Pour plus d’informations, voir Charger des données dans les tables Apache Iceberg™.

Note

  • Snowflake prend également en charge l’écriture dans des tables Iceberg gérées en externe. Pour plus d’informations, voir Prise en charge de l’écriture des tables Apache Iceberg™ gérées en externe et Écriture dans des tables Iceberg gérées en externe.

  • Pour les tables Iceberg gérées par Snowflake, si une opération DML échoue de manière inattendue et s’annule, certains fichiers Parquet peuvent être écrits dans votre stockage Cloud externe, mais ils ne seront pas suivis ou référencés par les métadonnées de vos tables Iceberg. Ces fichiers Parquet sont des fichiers orphelins.

    Si vous constatez un décalage entre l’utilisation du stockage de votre stockage Cloud externe et celle de Snowflake, il se peut que vous ayez des fichiers orphelins dans votre stockage Cloud externe. Pour voir votre utilisation du stockage pour Snowflake, vous pouvez utiliser les Vue TABLE_STORAGE_METRICS ou les Vue TABLE_STORAGE_METRICS. Si vous constatez un décalage, contactez le Support Snowflake pour obtenir de l’aide pour déterminer si vous avez des fichiers orphelins et les supprimer.

Exemple : Mettre à jour une table

Vous pouvez utiliser les instructions INSERT et UPDATE pour modifier les tables Iceberg gérées par Snowflake.

L’exemple suivant insère une nouvelle valeur dans une table Iceberg nommée store_sales, puis met à jour la colonne cola sur 1 si la valeur est actuellement -99.

INSERT INTO store_sales VALUES (-99);

UPDATE store_sales
  SET cola = 1
  WHERE cola = -99;
Copy

Générer des instantanés des modifications DML

Pour les tables qui utilisent Snowflake comme catalogue, Snowflake génère automatiquement les métadonnées Iceberg. Snowflake écrit les métadonnées dans un dossier nommé metadata dans votre volume externe. Pour trouver le dossier metadata, voir Répertoires de données et de métadonnées.

Vous pouvez également appeler la fonction SYSTEM$GET_ICEBERG_TABLE_INFORMATION pour générer des métadonnées Iceberg pour toute nouvelle modification.

Pour des tables non gérées par Snowflake, la fonction renvoie des informations sur le dernier instantané actualisé.

Par exemple :

SELECT SYSTEM$GET_ICEBERG_TABLE_INFORMATION('db1.schema1.it1');
Copy

Sortie :

+-----------------------------------------------------------------------------------------------------------+
| SYSTEM$GET_ICEBERG_TABLE_INFORMATION('DB1.SCHEMA1.IT1')                                                   |
|-----------------------------------------------------------------------------------------------------------|
| {"metadataLocation":"s3://mybucket/metadata/v1.metadata.json","status":"success"}                         |
+-----------------------------------------------------------------------------------------------------------+

Utiliser les suppressions de niveau ligne

Snowflake prend en charge l’interrogation de tables avec des suppressions au niveau des lignes, ainsi que l’écriture dans des tables en utilisant les suppressions au niveau des lignes.

Interroger des tables

Snowflake prend en charge l’interrogation de tables Iceberg gérées en externe lorsque vous avez configuré les suppressions au niveau de la ligne pour les opérations de mise à jour, de suppression et de fusion.

Pour configurer les suppressions de niveau ligne, voir les propriétés d’écriture dans la documentation d’Apache Iceberg.

Écriture dans des tables via des fichiers de suppression positionnels

Note

  • Pris en charge uniquement pour les tables Iceberg gérées en externe.

  • Pour utiliser des suppressions au niveau des lignes de position, assurez-vous que la version Iceberg des tables Iceberg est définie sur v2, qui est la valeur par défaut. Pour plus d’informations, voir ICEBERG_VERSION_DEFAULT. Si la version Iceberg est définie sur v3, le comportement de fusion sur lecture dans Snowflake consiste à utiliser des vecteurs de suppression.

Snowflake prend en charge les suppressions de position au niveau des lignes pour l’écriture dans des tables Iceberg gérées en externe et stockées sur Amazon S3, Azure ou Google Cloud. Pour désactiver les suppressions de position, qui permettent l’exécution des opérations DML en mode copie sur écriture, définissez le paramètre ENABLE_ICEBERG_MERGE_ON_READ sur FALSE au niveau de la table, du schéma ou de la base de données.

Écriture dans des tables via des vecteurs de suppression

Pour optimiser les modifications des données au niveau des lignes, Snowflake prend en charge les vecteurs de suppression pour l’écriture dans des tables Iceberg gérées en externe et gérées par Snowflake stockées sur Amazon S3, Azure ou Google Cloud. Avec les vecteurs de suppression, Snowflake peut effectuer des opérations de « fusion sur lecture » (MOR), qui améliorent les performances d’écriture pour les instructions DML suivantes :

  • DELETE

  • UPDATE

  • MERGE

Snowflake atteint cette performance en écrivant de petits fichiers vectoriels au lieu de réécrire de gros fichiers de données. Pour plus d’informations, consultez Suppression de vecteurs dans la spécification Apache Iceberg.

Activer les vecteurs de suppression

Pour activer les vecteurs de suppression, procédez comme suit :

  1. Définissez la version Iceberg par défaut pour les tables Iceberg sur v3 en suivant les instructions dans Configurer la version Iceberg par défaut.

    Note

    Si la version Iceberg par défaut pour les tables Iceberg est v2, Snowflake effectue des opérations de « fusion sur lecture » (MOR) en utilisant des fichiers de suppression positionnels.

  2. Définissez le paramètre ENABLE_ICEBERG_MERGE_ON_READ sur:code:TRUE, qui est la valeur par défaut, en suivant les instructions dans ENABLE_ICEBERG_MERGE_ON_READ.

  3. Pour exécuter les opérations DML en mode copie sur écriture, définissez le paramètre ENABLE_ICEBERG_MERGE_ON_READ sur FALSE.

Notes sur l’utilisation pour les vecteurs de suppression

  • Comportement par défaut

    • La valeur système par défaut pour ENABLE_ICEBERG_MERGE_ON_READ est TRUE.

  • Heuristiques de méthode d’écriture

    • Lorsque ENABLE_ICEBERG_MERGE_ON_READ est défini surTRUE, Snowflake utilise des heuristiques pour décider par fichier s’il convient d’utiliser la fusion sur lecture ou la copie sur écriture :

      • Nombre de lignes : Snowflake n’écrit un vecteur de suppression que si moins de ~5 % des lignes d’un fichier de données sont supprimées. Si ≥5 % sont supprimées, Snowflake réécrit le fichier en utilisant la copie sur écriture.

      • Taille du fichier : pour que Snowflake puisse écrire des vecteurs de suppression, le fichier de données doit être plus grand qu’environ 1,6 MB.

  • Compatibilité

    • Si vous utilisez des moteurs de calcul qui ne prennent pas encore en charge les vecteurs de suppression Iceberg v3, définissez ENABLE_ICEBERG_MERGE_ON_READ sur FALSE pour appliquer la copie sur écriture à toutes les écritures.

  • Précédence des paramètres

    • Snowflake ne vérifie que le paramètre ENABLE_ICEBERG_MERGE_ON_READ pour déterminer la méthode d’écriture. Il ne reconnaît pas les propriétés de tables Iceberg suivantes :

      • write.delete.mode

      • write.update.mode

      • write.merge.mode

Copie sur écriture ou fusion sur lecture

Iceberg propose deux modes de configuration de la manière dont les moteurs de calcul gèrent les opérations de niveau ligne pour les tables gérées en externe. Snowflake prend en charge ces deux modes.

Le tableau suivant décrit les cas dans lesquels vous pourriez avoir besoin d’utiliser l’un ou l’autre mode :

Mode

Description

Copie sur écriture (par défaut)

Ce mode donne la priorité au temps de lecture et affecte la vitesse d’écriture.

Lorsque vous effectuez une opération de mise à jour, de suppression ou de fusion, votre moteur de calcul réécrit l’intégralité du fichier de données Parquet concerné. Cela peut ralentir les écritures, surtout si vous avez des fichiers de données volumineux, mais n’a pas d’impact sur le temps de lecture.

Il s’agit du mode par défaut.

Fusion sur lecture

Ce mode donne la priorité à la vitesse d’écriture et affecte légèrement le temps de lecture.

Lorsque vous effectuez une opération de mise à jour, de suppression ou de fusion, votre moteur de calcul crée un fichier de suppressions qui ne contient des informations que sur les lignes modifiées.

Lorsque vous lisez les données d’une table, votre moteur de requête fusionne les fichiers de suppressions avec les fichiers de données. La fusion peut augmenter le temps de lecture. Toutefois, vous pouvez optimiser les performances de lecture en planifiant des opérations régulières de compactage et de maintenance des tables.

Pour plus d’informations sur les modifications de niveau ligne pour Iceberg, voir Suppressions de niveau ligne dans la documentation d’Apache Iceberg.

Considérations et limites

Tenez compte des informations suivantes lorsque vous utilisez des suppressions de niveau de lignes avec des tables Iceberg :

  • Snowflake prend en charge les suppressions de position uniquement pour les tables Iceberg v2, et les vecteurs de suppression pour les tables Iceberg v3.

  • Snowflake ne prend en charge que les suppressions de positions avec des tables Iceberg gérées en externe.

  • Pour obtenir les meilleures performances de lecture lorsque vous utilisez des suppressions de niveau ligne, procédez régulièrement au compactage et à la maintenance des tables afin de supprimer les anciens fichiers de suppression. Pour plus d’informations, voir Gestion des tables utilisant un catalogue externe.

  • Des suppressions de position excessives, en particulier des suppressions de position en suspens, peuvent empêcher les opérations de création et d’actualisation des tables. Pour éviter ce problème, effectuez la maintenance des tables pour supprimer les suppressions de position supplémentaires.

    La méthode de maintenance des tables à utiliser dépend de votre moteur Iceberg externe. Par exemple, vous pouvez utiliser la méthode rewrite_data_files pour Spark avec les options delete-file-threshold ou rewrite-all. Pour plus d’informations, consultez rewrite_data_files dans la documentation Apache Iceberg™.

Définir une taille de fichier cible

Pour améliorer les performances des requêtes pour les moteurs Iceberg externes tels que Spark ou Trino, vous pouvez configurer une taille de fichier cible à la fois pour les tables gérées par Snowflake et pour les tables Iceberg gérées en externe avec prise en charge de l’écriture. Vous pouvez définir une taille spécifique (16MB, 32MB, 64MB ou 128MB) ou utiliser l’option AUTO. AUTO fonctionne différemment selon le type de table :

  • Tables gérées par Snowflake : AUTO spécifie que Snowflake doit choisir la taille du fichier de la table en fonction de caractéristiques de la table telles que la taille, les modèles DML, la charge de travail d’ingestion et la configuration du clustering. Snowflake ajuste automatiquement la taille du fichier, à partir de 16 MB, pour de meilleures performances en lecture et en écriture dans Snowflake.

  • Tables gérées en externe : AUTO spécifie que Snowflake doit être mis à l’échelle de manière dynamique en fonction d’une taille de fichier plus importante.

Vous pouvez définir la taille du fichier cible lorsque vous créez une table Iceberg ou exécuter la commande ALTER ICEBERG TABLE pour modifier la taille du fichier cible d’une table Iceberg existante. Snowflake tente de maintenir des tailles de fichiers proches de la taille cible lors de l’écriture de fichiers Parquet pour une table.

Après avoir défini une taille de fichier cible, Snowflake commence immédiatement à créer des fichiers plus volumineux pour les opérations du nouveau langage de manipulation de données (DML). Les opérations de maintenance des tables Snowflake modifient de manière asynchrone les fichiers de tables existants en fonction de la taille du fichier cible.

L’exemple suivant utilise TARGET_FILE_SIZE pour définir une taille de fichier cible de 128 MB pour une table gérée par Snowflake :

CREATE ICEBERG TABLE my_iceberg_table (col1 INT)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  TARGET_FILE_SIZE = '128MB';
Copy

Vous pouvez également utiliser ALTER ICEBERG TABLE pour définir la propriété TARGET_FILE_SIZE d’une table existante :

ALTER ICEBERG TABLE my_iceberg_table
  SET TARGET_FILE_SIZE = '32MB';
Copy

Pour vérifier la valeur de la propriété TARGET_FILE_SIZE pour une table, utilisez la commande SHOW PARAMETERS :

SHOW PARAMETERS LIKE 'target_file_size' FOR my_iceberg_table;
Copy

Optimisation des tables pour les tables Iceberg gérées par Snowflake

L’optimisation des tables effectue automatiquement la maintenance pour améliorer les performances et réduire les coûts de stockage de vos tables Iceberg gérées par Snowflake.

Note

  • Snowflake ne prend pas en charge la suppression des fichiers orphelins pour les tables Iceberg gérées par Snowflake. Si vous constatez un décalage entre l’utilisation du stockage de votre stockage Cloud externe et celle de Snowflake, il se peut que vous ayez des fichiers orphelins dans votre stockage Cloud externe. Pour voir votre utilisation du stockage pour Snowflake, vous pouvez utiliser les Vue TABLE_STORAGE_METRICS ou les Vue TABLE_STORAGE_METRICS. Si vous constatez un décalage, contactez le Support Snowflake pour obtenir de l’aide pour déterminer si vous avez des fichiers orphelins et les supprimer.

  • Pour améliorer les performances des requêtes, vous pouvez également définir une taille de fichier cible. Pour plus d’informations, voir Définir une taille de fichier cible.

Snowflake prend en charge les fonctionnalités d’optimisation des tables Iceberg résumées dans le tableau suivant :

Fonctionnalité

Améliore les performances des requêtes

Réduit les coûts de stockage

Remarques

Clustering automatique [1]

  • Facturé.

  • Désactivé par défaut

Compactage des données

  • Facturé.

  • Activé par défaut

Compactage des manifestes

  • Aucun coût.

  • Activé automatiquement ; vous ne pouvez pas le désactiver.

Expiration des instantanés

  • Aucun coût.

  • Activé automatiquement ; vous ne pouvez pas le désactiver.

[1] Contrairement aux autres fonctionnalités d’optimisation des tables, le clustering automatique est facturé séparément en tant que fonctionnalité autonome.

Clustering automatique

Le clustering automatique réorganise les données en fichiers ou partitions en fonction des colonnes fréquemment interrogées. La taille de fichier pour les tables Iceberg est basée sur la configuration de votre clustering, à moins que vous ne définissiez une taille de fichier cible. Si vous le faites, la taille de fichier correspond à la taille spécifique que vous avez définie. Pour plus d’informations, voir Définir une taille de fichier cible.

Pour définir le clustering automatique, spécifiez le paramètre CLUSTER BY lorsque vous créez une table Iceberg gérée par Snowflake ou que vous modifiez une table existante. Pour plus d’informations, voir :

Pour plus d’informations sur le clustering automatique, consultez Clustering automatique.

Compactage des données

Le compactage des données combine de petits fichiers en fichiers plus volumineux et plus efficaces pour gérer le stockage, maintenir une taille optimale des fichiers, et améliorer les performances des requêtes.

Dans la plupart des cas, le compactage des données n’a pas d’effet significatif sur les coûts de calcul, mais si ces coûts constituent un problème, vous pouvez désactiver le compactage. Par exemple, vous pouvez souhaiter désactiver le compactage sur une table si vous l’interrogez rarement. Pour désactiver ou activer le compactage des données, consultez Définition du compactage des données.

Note

  • Pour interroger des tâches de compactage des données pour les tables Iceberg, consultez Vue ICEBERG_STORAGE_OPTIMIZATION_HISTORY. Cette vue inclut le nombre de crédits qui sont facturés pour le compactage des données.

  • Si le Clustering automatique est activé, le clustering effectue un compactage des données sur la table. Le compactage des données est effectué indépendamment du fait qu’il soit activé ou désactivé sur la table.

  • Vous avez également la possibilité de définir une taille de fichier cible. Pour plus d’informations, voir Définir une taille de fichier cible.

Compactage des manifestes

Le compactage des manifestes optimise la couche de métadonnées en réorganisant et en combinant des fichiers manifestes plus petits. Ce compactage réduit la surcharge des métadonnées et améliore les performances des requêtes.

Cette fonctionnalité est activée automatiquement et vous ne pouvez pas la désactiver.

Expiration de l’instantané

L’expiration des instantanés supprime systématiquement les anciens instantanés et leurs fichiers de données et de métadonnées uniques de l’historique de la table. Cette suppression est basée sur des politiques de conservation prédéfinies.

Cette fonctionnalité est activée automatiquement et vous ne pouvez pas la désactiver.

Gestion des tables utilisant un catalogue externe

Vous pouvez effectuer des opérations de maintenance sur les tables Iceberg qui utilisent un catalogue externe.

Les opérations de maintenance incluent les suivantes :

  • Instantanés qui expirent

  • Suppression des anciens fichiers de métadonnées

  • Compactage des fichiers de données

Important

Pour que votre table Iceberg reste synchronisée avec les changements externes, il est important d’aligner votre planification d’actualisation de Snowflake avec la maintenance de la table. Actualisez la table chaque fois que vous effectuez une opération de maintenance.

Pour en savoir plus sur la maintenance des tables Iceberg qui ne sont pas gérées par Snowflake, consultez Maintenance dans la documentation Apache Iceberg.

Actualiser les métadonnées de la table

Lorsque vous utilisez un catalogue Iceberg externe, vous pouvez actualiser les métadonnées de la table à l’aide de la commande ALTER ICEBERG TABLE … REFRESH. L’actualisation des métadonnées de la table synchronise les métadonnées en y apportant les modifications les plus récentes de la table.

Note

Nous vous recommandons de paramétrer l”actualisation automatique pour les tables gérées en externe qui sont prises en charge.

Actualisation des métadonnées d’une table

L’exemple suivant actualise manuellement les métadonnées d’une table qui utilise un catalogue externe (par exemple, AWS Glue ou Delta). L’actualisation de la table permet de synchroniser la table en permanence en fonction des modifications apportées dans le catalogue distant.

Avec ce type de table Iceberg, il n’est pas nécessaire de spécifier un chemin d’accès au fichier de métadonnées dans la commande.

ALTER ICEBERG TABLE my_iceberg_table REFRESH;
Copy

Pour assurer la mise à jour automatique d’une table, vous pouvez paramétrer l”actualisation automatique. Utilisez la commande ALTER ICEBERG TABLE.

Par exemple :

ALTER ICEBERG TABLE my_iceberg_table SET AUTO_REFRESH = TRUE;
Copy

Actualisation des métadonnées d’une table créée à partir de fichiers Iceberg

L’exemple suivant actualise manuellement une table créée à partir de fichiers de métadonnées Iceberg dans un emplacement de stockage cloud externe, en spécifiant le chemin d’accès relatif à un fichier de métadonnées sans barre oblique (/). Le fichier de métadonnées définit les données de la table après actualisation.

ALTER ICEBERG TABLE my_iceberg_table REFRESH 'metadata/v1.metadata.json';
Copy

Récupération des métriques de stockage

Snowflake ne facture pas à votre compte les coûts de stockage de tables Iceberg. Toutefois, vous pouvez connaître la quantité de mémoire occupée par une table Iceberg en interrogeant les vues TABLE_STORAGE_METRICS et TABLES dans le schéma Schéma d’information de Snowflake ou Account Usage.

L’exemple de requête suivant joint la vue ACCOUNT_USAGE.TABLE_STORAGE_METRICS à la vue ACCOUNT_USAGE.TABLES, en filtrant sur la colonne 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

Définition du compactage des données

Vous pouvez définir le compactage des données sur les tables Iceberg gérées par Snowflake lorsque vous créez une base de données, un schéma ou une table, ou exécuter la commande ALTER pour modifier la configuration d’une base de données, d’un schéma ou d’une table qui existe déjà. Vous pouvez également définir le compactage des données au niveau du compte à l’aide de la commande ALTER ACCOUNT. Pour plus d’informations sur le compactage des données, consultez Compactage des données.

L’exemple suivant utilise ENABLE_DATA_COMPACTION pour désactiver le compactage des données pour une table gérée par Snowflake :

CREATE ICEBERG TABLE my_iceberg_table (col1 INT)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  ENABLE_DATA_COMPACTION = FALSE;
Copy

Vous pouvez également utiliser ALTER ICEBERG TABLE pour le désactiver pour une table existante.

ALTER ICEBERG TABLE my_iceberg_table
  SET ENABLE_DATA_COMPACTION = FALSE;
Copy

Pour plus d’informations, voir :

Utiliser des valeurs par défaut avec des tables Iceberg

Note

Pour les autres fonctionnalités Iceberg v3 prises en charge dans cette prévisualisation, consultez Tables Apache Iceberg™ : Prise en charge de Apache Iceberg™ v3 (Prévisualisation).

Cette prévisualisation présente la prise en charge de la fonctionnalité des valeurs par défaut pour les tables Apache Iceberg™, conformément à la spécification Iceberg v3.

Important

Pour utiliser des valeurs par défaut avec des tables Iceberg, les tables doivent être conformes à la v3 de la spécification de table Apache Iceberg™. Pour savoir comment configurer la version Iceberg pour les tables, consultez Configurer la version Iceberg par défaut.

Cette fonctionnalité vous permet de définir des valeurs par défaut pour les enregistrements existants et les nouveaux enregistrements sans avoir à réécrire les fichiers de données existants. Vous pouvez définir les valeurs par défaut suivantes pour les colonnes de table :

  • Une valeur par défaut initiale, qui fournit une valeur par défaut pour les enregistrements existants lorsqu’un champ est ajouté.

  • Une valeur par défaut en écriture, qui fournit une valeur par défaut pour les nouveaux enregistrements si le champ avec la valeur par défaut n’est pas spécifié pendant les écritures.

Avec cette fonctionnalité, vous pouvez faire évoluer les schémas tout en présentant des valeurs pour les données historiques et fournir une valeur de secours pour les écritures futures. Pour plus d’informations, consultez Valeurs par défaut.

Vous pouvez spécifier une valeur par défaut lorsque vous créez ou modifiez une table :

  • Pour créer une table avec une valeur par défaut pour une colonne, utilisez le mot-clé DEFAULT avec votre définition de colonne. La valeur que vous spécifiez est définie à la fois comme valeur par défaut initiale et comme valeur par défaut en écriture pour la colonne. Vous ne pouvez pas modifier la valeur initiale par défaut de la colonne.

  • Pour ajouter une colonne avec une valeur par défaut à une table, utilisez le mot-clé DEFAULT avec la définition de colonne dans votre commande ALTER ICEBERG TABLE. La valeur que vous spécifiez est définie à la fois comme valeur par défaut initiale et comme valeur par défaut en écriture pour la colonne. Vous ne pouvez pas modifier la valeur initiale par défaut de la colonne.

  • Pour modifier l’écriture par défaut d’une colonne, utilisez les mots-clés WRITE DEFAULT avec la commande ALTER ICEBERG TABLE.

Important

Lorsque vous spécifiez une valeur par défaut pour une colonne, vous devez spécifier une valeur statique ; vous ne pouvez pas spécifier une expression ou une fonction pour la valeur. Cette exigence est conforme à la spécification Iceberg v3 et s’applique à la fois à la valeur par défaut initiale et à la valeur par défaut d’écriture.

Les sections suivantes incluent des exemples sur la manière de spécifier des valeurs par défaut et de modifier la valeur d’écriture par défaut.

Exemple : Créer une table avec une valeur par défaut

Pour créer une table Iceberg avec des valeurs par défaut, utilisez la commande CREATE ICEBERG TABLE.

Dans l’exemple suivant, vous définissez d’abord une valeur par défaut pour une colonne lorsque vous créez une table Iceberg gérée par Snowflake. Ensuite, vous insérez un enregistrement dans la table sans spécifier de valeur pour la colonne avec la valeur par défaut.

  1. Créez une table user_events, qui comprend une colonne event_version avec une valeur par défaut de 2 :

    CREATE ICEBERG TABLE user_events (
        event_id INT,
        user_id INT,
        event_type STRING,
        event_time TIMESTAMP,
        event_version INT DEFAULT 2
      )
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'my_external_volume'
      BASE_LOCATION = 'database/schema/user_event'
      ICEBERG_VERSION = 3;
    
    Copy

    La définition d’une valeur par défaut dans la définition de la table définit une valeur par défaut initiale et une valeur par défaut d’écriture. Comme la colonne a une écriture par défaut, la valeur 2 sera utilisé pour les nouveaux enregistrements si la event_version n’est pas spécifiée lors des écritures.

  2. Ajoutez un événement de connexion avec une event_version spécifiée :

    INSERT INTO user_events VALUES
      (1, 101, 'login', '2025-11-01 10:00:00', 1);
    
    Copy
  3. Ajoutez un événement d’achat, mais sans spécifier de event_version :

    INSERT INTO user_events VALUES
    (1, 101, 'purchase', '2025-11-01 10:01:00');
    
    Copy

    Par conséquent, Snowflake entre la valeur pour event_version dans la table en tant que 2.

  4. Interrogez la table :

    SELECT * FROM user_events;
    
    Copy

    Sortie :

    +-----------+----------+-------------+---------------------+----------------+
    | event_id  | user_id  | event_type  | event_time          | event_version  |
    +-----------+----------+-------------+---------------------+----------------+
    | 1         | 101      | login       | 2025-11-01 10:00:00 | 1              |
    | 1         | 101      | purchase    | 2025-11-01 10:01:00 | 2              |
    +-----------+----------+-------------+---------------------+----------------+
    

Exemple : Ajouter une colonne avec une valeur par défaut à une table existante

Pour ajouter une nouvelle colonne avec une valeur par défaut à une table Iceberg, utilisez la commande ALTER ICEBERG TABLE.

Dans l’exemple suivant, vous modifiez la table user_events en ajoutant une colonne event_version, qui a une valeur par défaut de 2 :

ALTER ICEBERG TABLE user_events ADD COLUMN event_version INT DEFAULT 2;
Copy

Outre la définition d’une valeur par défaut en écriture, l’ajout d’une colonne avec une valeur par défaut définit également une valeur par défaut initiale pour la colonne. Par conséquent, la valeur par défaut des enregistrements existants pour la colonne event_version est 2.

Exemple : Modifier l’écriture par défaut d’une colonne

L’exemple suivant modifie l’écriture par défaut pour la colonne event_version de la table user_events en 3 :

ALTER ICEBERG TABLE user_events ALTER COLUMN event_version SET WRITE DEFAULT 3;
Copy

Afficher les valeurs par défaut définies pour une table

Pour afficher la valeur par défaut d’une colonne de table dans une table Iceberg gérée par Snowflake ou en externe, exécutez la commande DESCRIBE ICEBERG TABLE, puis affichez la colonne DEFAULT et la colonne WRITE DEFAULT dans la sortie :

  • La colonne DEFAULT mappe sur la valeur initial-default dans la spécification Apache Iceberg.

  • La colonne WRITE DEFAULT mappe sur la valeur write-default dans la spécification Apache Iceberg.

Ces colonnes sont renvoyées dans la sortie, que la table soit une table v2 Iceberg ou une table v3 Iceberg.

L’exemple suivant décrit les colonnes pour la table user_events. Cette table possède une valeur initiale par défaut et une valeur d’écriture par défaut spécifiées pour la colonne event_version :

DESC ICEBERG TABLE user_events
  ->> SELECT
    "name",
    "kind",
    "default",
    "write default"
      FROM $1;
Copy

Sortie :

+-----------------+---------+---------+---------------+
| name            | kind    | default | write default |
+-----------------+---------+-------------------------+
| EVENT_ID        | COLUMN  |         |               |
| USER_ID         | COLUMN  |         |               |
| EVENT_TYPE      | COLUMN  |         |               |
| EVENT_TIME      | COLUMN  |         |               |
| EVENT_VERSION   | COLUMN  | 2       | 3             |
+-----------------+---------+---------+---------------+

Supprimer l’écriture par défaut

Pour supprimer l’écriture par défaut d’une colonne, utilisez les mots-clés DROP WRITE DEFAULT avec la commande ALTER ICEBERG TABLE.

L’exemple suivant supprime la valeur d’écriture par défaut pour la colonne event_version :

ALTER ICEBERG TABLE user_events ALTER COLUMN event_version DROP WRITE DEFAULT;
Copy

Considérations et limitations relatives aux valeurs par défaut

Tenez compte des éléments suivants lorsque vous utilisez des valeurs par défaut avec des tables Iceberg gérées par Snowflake et des tables Iceberg gérées en externe :

Tables Iceberg gérées par Snowflake et gérées en externe

  • Vous ne pouvez pas ajouter ou modifier ultérieurement une valeur initiale par défaut pour une colonne après l’avoir créée. Par conséquent, vous devez supprimer la colonne et ajouter la colonne en utilisant les commandes ALTER TABLE … DROP COLUMN et ALTER TABLE … ADD COLUMN.

  • La taille maximale d’une valeur par défaut est de 128|~|MB.

  • Les valeurs par défaut ne peuvent pas utiliser de types de données qui ne peuvent pas être représentés sous forme de constantes, de sorte que vous ne pouvez pas utiliser les types de données suivants avec une valeur par défaut :

    • associer

    • list

    • struct

    • variant

Tables Iceberg gérées par Snowflake

  • La valeur write-default est toujours initialisée sur la valeur initial-default. Pour voir la valeur par défaut de ces deux valeurs, exécutez la commande DESCRIBE ICEBERG TABLE, puis affichez les colonnes WRITE DEFAULT et DEFAULT dans la sortie.

  • Vous ne pouvez pas spécifier une valeur par défaut qui utilise le type de données TIMESTAMP_NTZ(9) ou TIMESTAMP_LTZ(9).

  • Vous ne pouvez définir qu’une valeur par défaut pour une expression, telle que DEFAULT pi(), lorsque vous créez une table ; vous ne pouvez pas définir une valeur par défaut sur une expression lorsque vous modifiez une table en utilisant la commande ALTER ICEBERG TABLE.

  • Les séquences ne sont pas prises en charge.

    Par exemple, la commande CREATE ICEBERG TABLE échoue, car elle inclut LOG_ID NUMBER(38,0) NOT NULL autoincrement order :

    CREATE OR REPLACE ICEBERG TABLE CDC_RUN_LOG (
        LOG_ID NUMBER(38,0) NOT NULL autoincrement order,
        ENTITY_NAME VARCHAR(100),
        LAST_RUN TIMESTAMP_NTZ(9),
        DAG_NAME VARCHAR(100)
        )
        CATALOG = 'SNOWFLAKE'
        EXTERNAL_VOLUME = 'my_external_volume'
        BASE_LOCATION = 'my_iceberg_table';
        COMMENT='CDC table to manage log of runs'
        ICEBERG_VERSION = 3;
    
    Copy

Tables Iceberg gérées en externe

  • Vous ne pouvez pas spécifier une valeur par défaut qui utilise le type de données TIMESTAMP_NTZ(9) ou TIMESTAMP_LTZ(9).

Ces considérations et limitations s’appliquent aux valeurs par défaut, qui sont des fonctionnalités d’Iceberg v3. Pour une liste des considérations et limitations qui s’appliquent à toutes les tables Iceberg v3, consultez Considérations et limites des fonctionnalités Iceberg v3.

Utiliser la lignée de lignes avec les tables Iceberg

Note

Pour les autres fonctionnalités Iceberg v3 prises en charge dans cette prévisualisation, consultez Tables Apache Iceberg™ : Prise en charge de Apache Iceberg™ v3 (Prévisualisation).

Cette prévisualisation introduit la prise en charge de la fonctionnalité de lignée de lignes pour les tables Apache Iceberg™. Avec cette fonctionnalité, les colonnes suivantes sont automatiquement écrites par Snowflake dans une table Iceberg :

  • _row_id

  • _last_updated_sequence_number

Cette fonctionnalité permet aux moteurs de requête de faire correspondre de manière fiable la même ligne à travers les instantanés et de détecter les modifications au niveau des lignes. Pour plus d’informations, consultez Lignée de lignes.

Cette fonctionnalité est prise en charge à la fois avec les tables Iceberg gérées par Snowflake et avec les tables Iceberg gérées en externe.

Important

Pour utiliser la lignée de lignes avec des tables Iceberg, les tables doivent être conformes à la v3 de la spécification de table Apache Iceberg™. Pour savoir comment configurer la version Iceberg pour les tables, consultez Configurer la version Iceberg par défaut.

Considérations et limitations relatives à la lignée de lignes

La lignée de lignes est prise en charge dans les flux avec les considérations suivantes :

  • 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.

Ces considérations et limitations s’appliquent à la lignée de lignes, qui est une fonctionnalité d’Iceberg v3. Pour une liste des considérations et limitations qui s’appliquent à toutes les tables Iceberg v3, consultez Considérations et limites des fonctionnalités Iceberg v3.