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

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 (prévisualisation). 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.

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

Note

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

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.

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 points suivants lorsque vous utilisez des suppressions de niveau ligne avec des tables Iceberg gérées en externe :

  • Snowflake ne prend en charge que les suppressions par position.

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

  • L’actualisation automatique n’est actuellement pas prise en charge lorsque vous utilisez des suppressions de position.

  • 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 Delta, 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

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