Conversion d’une table Iceberg

Ce chapitre fournit des informations sur la conversion d’une table Iceberg non gérée par Snowflake en une table qui utilise Snowflake comme catalogue Iceberg.

Vous pouvez choisir de convertir une table lorsque vous souhaitez une prise en charge de plateforme Snowflake complète, y compris la prise en charge du SDK du catalogue Iceberg Snowflake.

Pour en savoir plus sur les différences entre les types de table Iceberg, voir Options de catalogue Iceberg.

Avant et après la conversion de table

Lorsque vous convertissez une table Iceberg pour utiliser Snowflake comme catalogue, la table devient accessible en écriture et Snowflake prend en charge la gestion de son cycle de vie.

Le tableau suivant compare des tables Iceberg avant et après la conversion :

Avant la conversion

Après la conversion

Catalogue Iceberg

Catalogue externe (tel que AWS Glue), ou pas de catalogue du tout. Nécessite une intégration de catalogue.

Snowflake. Snowflake enregistre les modifications apportées aux données sources et enregistre les modifications dans le catalogue Snowflake. Snowflake met ensuite à jour les métadonnées de la table dans votre volume externe.

Ne nécessite pas d’intégration de catalogue.

Opérations de lecture Snowflake

Opérations d’écriture Snowflake

Emplacement de stockage des données et des métadonnées de la table

Volume externe (stockage Cloud externe).

Volume externe (stockage Cloud externe) sous un emplacement de base que vous spécifiez.

Nettoyage des données et des métadonnées

Géré par vous ou votre catalogue externe.

Snowflake ne touche à aucun fichier de données ou de métadonnées généré en externe.

Accessible à partir du SDK du catalogue Iceberg Snowflake

Important

Lorsque vous convertissez une table Iceberg, Snowflake ne verrouille pas et n’assume pas l’accès exclusif à votre stockage externe. Pour éviter la corruption des tables, assurez-vous de surveiller et/ou d’arrêter toutes les écritures autres que Snowflake (telles que les tâches de maintenance automatisées) dans votre emplacement de stockage externe.

Exigences

Avant de convertir une table Iceberg, assurez-vous que Snowflake puisse écrire dans votre volume externe.

Pour que Snowflake puisse écrire dans votre volume externe, les conditions suivantes doivent être remplies :

  • Utilisez la commande ALTER ICEBERG TABLE … REFRESH pour actualiser manuellement la table avant de la convertir.

  • La propriété ALLOW_WRITES de votre volume externe est définie sur TRUE. Pour mettre à jour la valeur de cette propriété pour un volume externe existant, utilisez la commande ALTER EXTERNAL VOLUME. Par exemple : ALTER EXTERNAL VOLUME my_ext_vol SET ALLOW_WRITES=TRUE.

  • Les autorisations de contrôle d’accès que vous définissez sur le compte de stockage Cloud doivent permettre l’accès en écriture. Par exemple, si vous utilisez un volume externe configuré pour Amazon S3, votre rôle IAM doit avoir l’autorisation s3:PutObject pour votre emplacement S3.

Exemple : Convertir une table Iceberg

Cet exemple commence par créer une table Iceberg à partir de fichiers Iceberg dans le stockage d’objets. Snowflake utilise la valeur METADATA_FILE_PATH pour rechercher les métadonnées de la table à l’emplacement suivant pour les définitions de colonne : <ext-vol-storage-base-url>/path/to/metadata/v1.metadata.json.

CREATE ICEBERG TABLE myIcebergTable
  EXTERNAL_VOLUME='icebergMetadataVolume'
  CATALOG='icebergCatalogInt'
  METADATA_FILE_PATH='path/to/metadata/v1.metadata.json';
Copy

Ensuite, utilisez la commande ALTER ICEBERG TABLE … REFRESH pour synchroniser les métadonnées de la table sur le dernier fichier de métadonnées. L’exemple de commande suivant actualise la table en spécifiant un chemin d’accès au fichier de métadonnées.

ALTER ICEBERG TABLE myIcebergTable REFRESH 'metadata/v2.metadata.json';
Copy

Pour finir, convertissez la table de sorte à utiliser Snowflake comme catalogue Iceberg via une commande ALTER ICEBERG TABLE … CONVERT TO MANAGED.

ALTER ICEBERG TABLE myIcebergTable CONVERT TO MANAGED
  BASE_LOCATION = myBaseLocation;
Copy

Note

Dans cet exemple, l’instruction ALTER doit spécifier un BASE_LOCATION, parce que la table a été créée à partir de fichiers Iceberg dans le stockage objet et que l”BASE_LOCATION ne faisait pas partie de l’instruction CREATE ICEBERG TABLE d’origine. L”BASE_LOCATION définit le chemin d’accès relatif depuis votre volume externe à un répertoire dans lequel Snowflake écrit les données et métadonnées de table de la table convertie.

Sinon, si BASE_LOCATION a été spécifié dans l’instruction CREATE ICEBERG TABLE d’origine, il n’est pas nécessaire de l’inclure dans la commande ALTER ICEBERG TABLE …. CONVERT TO MANAGED.

Par exemple, Snowflake écrit les données de table dans <ext-vol-storage-base-url>/myBaseLocation/data/.

Snowflake écrit les métadonnées de la table convertie dans <ext-vol-storage-base-url>/myBaseLocation/metadata/.

Conversion et types de données

Si vous convertissez une table avec un type de données Iceberg que Snowflake ne prend pas en charge, Snowflake utilise un type de données Snowflake pour traiter et renvoyer des valeurs. En revanche, Snowflake écrit le type de données Iceberg d’origine dans les fichiers de données de la table afin que vous puissiez utiliser la table avec d’autres moteurs de calcul tels qu’Apache Spark.

Pour les types de données tels que int et long, le type de données utilisé par Snowflake pour le traitement prend en charge un éventail de valeurs plus large que le type de données source. Pour rester cohérent avec le type de données source, Snowflake ne permet pas d’insérer des valeurs en dehors de la plage prise en charge par le type de données source.

Prenons l’exemple d’une table comportant une colonne de type Iceberg int. Après la conversion, Snowflake traite les valeurs des colonnes en utilisant le type de données Snowflake NUMBER(10,0). NUMBER(10,0) a une plage de (-9,999,999,999, +9,999,999,999), mais int a une plage plus limitée de (-2,147,483,648, +2,147,483,647). Si vous essayez d’insérer une valeur 3,000,000,000 dans cette colonne, Snowflake renvoie un message d’erreur hors plage.

Pour plus d’informations sur les types de données, y compris les limites, voir Types de données des tables Iceberg.