Vue d’ensemble du chargement de données¶
Cette rubrique fournit une vue d’ensemble des principales options disponibles pour charger des données dans Snowflake.
Pour mesurer facilement et avec précision la latence d’ingestion de vos pipelines de données, utilisez les horodatages des lignes. Pour plus d’informations, voir Utiliser des horodatages de lignes pour mesurer la latence dans vos pipelines.
Emplacements de fichiers pris en charge¶
Snowflake fait référence à l’emplacement des fichiers de données dans le stockage Cloud en tant que zone de préparation. La commande COPY INTO <table> utilisée pour les chargements de données en masse et en continu (Snowpipe) prend en charge les comptes de stockage Cloud gérés par votre entité (zones de préparation externes) ainsi que le stockage Cloud contenu dans votre compte Snowflake (zones de préparation internes).
Zones de préparation externes¶
Le chargement de données à partir de l’un des services de stockage Cloud suivants est pris en charge quelle que soit la plateforme Cloud qui héberge votre compte Snowflake :
Amazon S3
Google Cloud Storage
Microsoft Azure
Vous ne pouvez pas accéder aux données conservées dans les classes de stockage dans le Cloud d’archives qui doivent être restaurées avant de pouvoir être récupérées. Ces classes de stockage d’archives comprennent, par exemple, la classe de stockage Amazon S3 Glacier Flexible Retrieval ou Glacier Deep Archive, ou Microsoft Azure Archive Storage.
Chargez (c’est-à-dire placez en zone de préparation) des fichiers sur votre compte de stockage Cloud à l’aide des outils fournis par le service de stockage Cloud.
Une zone de préparation externe nommée est un objet de base de données créé dans un schéma. Cet objet stocke les URL vers les fichiers du stockage Cloud, les paramètres utilisés pour accéder au compte de stockage Cloud et les paramètres de commodité tels que les options qui décrivent le format des fichiers en zone de préparation. Créez des zones de préparation à l’aide de la commande CREATE STAGE.
Note
Certains frais de facturation pour le transfert de données peuvent s’appliquer lors du chargement de données à partir de fichiers dans un service de stockage Cloud dans une région ou une plateforme Cloud différente de votre compte Snowflake. Pour plus d’informations, voir Comprendre le coût de transfert de données.
Zones de préparation internes¶
Snowflake gère les types de zone de préparation suivants dans votre compte :
- Utilisateur:
Une zone de préparation utilisateur est allouée à chaque utilisateur pour le stockage des fichiers. Ce type de zone de préparation est conçu pour stocker des fichiers qui sont en zone de préparation et gérés par un seul utilisateur, mais qui peuvent être chargés dans plusieurs tables. Les zones de préparation utilisateur ne peuvent être ni modifiées ni détruites.
- Table:
Une zone de préparation de table est disponible pour chaque table créée dans Snowflake. Ce type de zone de préparation est conçu pour stocker des fichiers qui sont en zone de préparation et gérés par un ou plusieurs utilisateurs, mais uniquement chargés dans une seule table. Les zones de préparation de table ne peuvent être ni modifiées ni détruites.
Notez qu’une zone de préparation de table n’est pas un objet de base de données distinct, mais plutôt une étape implicite liée à la table elle-même. Une zone de préparation de table n’a pas de privilèges qui lui sont propres. Pour préparer des fichiers dans une zone de préparation de table, les répertorier ou les interroger, ou même les détruire, vous devez être le propriétaire de la table (avoir le rôle doté du privilège OWNERSHIP sur la table).
- Nommé:
Une zone de préparation interne nommée est un objet de base de données créé dans un schéma. Ce type de zone de préparation peut stocker des fichiers qui sont en zone de préparation et gérés par un ou plusieurs utilisateurs et chargés dans une ou plusieurs tables. Les zones de préparation nommées étant des objets de base de données, la possibilité de les créer, de les modifier, de les utiliser ou de les détruire peut être contrôlée à l’aide des privilèges de contrôle d’accès de sécurité. Créez des zones de préparation à l’aide de la commande CREATE STAGE.
Chargez des fichiers vers l’un des types de zone de préparation interne à partir de votre système de fichiers local à l’aide de la commande PUT.
Chargement en masse ou en continu¶
Snowflake fournit les solutions principales suivantes pour le chargement de données. La meilleure solution peut dépendre du volume de données à charger et de la fréquence de chargement.
Chargement en masse à l’aide de la commande COPY¶
Cette option permet de charger des lots de données à partir de fichiers déjà disponibles dans le stockage Cloud ou de copier (c.-à-d. mettre en zone de préparation) des fichiers de données d’un ordinateur local vers un emplacement de stockage interne dans le Cloud (c.-à-d. Snowflake) avant de charger les données dans des tables à l’aide de la commande COPY.
Ressources de calcul¶
Le chargement en lot repose sur des entrepôts virtuels fournis par l’utilisateur, spécifiés dans l’instruction COPY. Les utilisateurs sont tenus de dimensionner l’entrepôt de manière appropriée pour s’adapter aux charges attendues.
Transformations simples pendant un chargement¶
Snowflake prend en charge la transformation des données tout en les chargeant dans une table à l’aide de la commande COPY. Les options comprennent :
Réorganisation des colonnes
Omission de colonnes
Conversions
Tronquer des chaînes de texte qui dépassent la longueur de colonne cible
Il n’est pas nécessaire que vos fichiers de données aient le même nombre et le même ordre de colonnes que votre table cible.
Chargement continu à l’aide de Snowpipe¶
Cette option est conçue pour charger de petits volumes de données (c.-à-d. des micro-lots) et les rendre progressivement disponibles pour analyse. Snowpipe charge les données dans les minutes qui suivent l’ajout de fichiers dans une zone de préparation et leur soumission en vue de leur intégration. Cela garantit aux utilisateurs les derniers résultats dès que les données brutes sont disponibles.
Ressources de calcul¶
Snowpipe utilise les ressources de calcul fournies par Snowflake (un modèle de calcul sans serveur). Ces ressources fournies par Snowflake sont automatiquement redimensionnées et mises à l’échelle, si nécessaire, et facturées et détaillées à l’aide d’une facturation à la seconde. L’ingestion de données est facturée en fonction des charges de travail réelles.
Transformations simples pendant un chargement¶
L’instruction COPY d’une définition de canal prend en charge les mêmes options de transformation COPY que lors du chargement en lot de données.
En outre, les pipelines de données peuvent tirer parti de Snowpipe pour charger en continu des micro-lots de données dans des tables en zone de préparation pour la transformation et l’optimisation à l’aide de tâches automatisées et des informations de capture de données modifiées (CDC) contenues dans des flux.
Chargement continu à l’aide de Snowpipe Streaming¶
L’API Snowpipe Streaming écrit des lignes de données directement dans les tables Snowflake sans nécessiter de fichiers mis en zone de préparation. Cette architecture se traduit par des latences de chargement plus faibles, avec des coûts réduits correspondants pour le chargement de tout volume de données, ce qui en fait un outil puissant pour le traitement des flux de données en quasi temps réel.
Snowpipe Streaming est également disponible pour le connecteur Snowflake pour Kafka, qui offre un chemin de mise à niveau facile pour tirer parti de la latence plus faible et des charges moins coûteuses.
Pour plus d’informations, reportez-vous à Snowpipe Streaming.
Chargement de données à partir de rubriques Apache Kafka¶
Le Connecteur Snowflake pour Kafka permet aux utilisateurs de se connecter à un serveur Apache Kafka , de lire les données d’un ou plusieurs sujets et de charger ces données dans des tables Snowflake.
Journalisation des erreurs DML¶
Lorsque vous exécutez un ensemble d’instructions DML et que l’une des instructions échoue avec une erreur, l’opération DML se termine et les modifications apportées par l’instruction DML sont annulées. Si vous voulez continuer à exécuter le reste des instructions DML et à enregistrer l’erreur qui s’est produite, vous pouvez activer la journalisation des erreurs DML pour la table. La table pour laquelle la journalisation des erreurs DML est activée est appelée table de base. Les erreurs sont consignées dans une table d’erreurs associée à la table de base.
La journalisation des erreurs DML est activée pour une table uniquement lorsque les deux conditions suivantes sont remplies :
La propriété ERROR_LOGGING est définie sur
TRUEpour la table.Le paramètre OPT_OUT_ERROR_LOGGING est défini sur
FALSEpour la session en cours.
La journalisation des erreurs DML est désactivée pour une table uniquement lorsque l’une des deux conditions suivantes est remplie :
La propriété ERROR_LOGGING est définie sur
FALSEpour la table.Le paramètre OPT_OUT_ERROR_LOGGING est défini sur
TRUEpour la session en cours.
Les sections suivantes fournissent plus d’informations sur la journalisation des erreurs DML :
Cas d’utilisation pour la journalisation des erreurs DML¶
Vous pouvez utiliser la journalisation des erreurs DML pour éviter les échecs sur les erreurs pour les cas d’utilisation suivants :
Migration de données tierces qui s’appuient sur la journalisation des erreurs DML, comme les données d’une base de données Oracle.
Application de certaines contraintes de table, telles que les contraintes NOT NULL, lors de l’ingestion de données.
Configurer la journalisation des erreurs DML pour une table¶
Vous pouvez activer ou désactiver la journalisation des erreurs DML pour une table Snowflake standard ou une table Iceberg gérée par Snowflake lorsque vous créez ou modifiez la table.
Pour activer ou désactiver la journalisation des erreurs pour une table, utilisez les commandes SQL suivantes pour définir la propriété ERROR_LOGGING pour la table :
CREATE ICEBERG TABLE (uniquement gérée par Snowflake)
ALTER ICEBERG TABLE (uniquement gérée par Snowflake)
Les exemples suivants configurent la journalisation des erreurs DML pour les tables et montrent comment les erreurs sont journalisées dans les tables d’erreurs :
Erreurs de journalisation lors de l’insertion directe de lignes
Erreurs de journalisation lors de l’insertion de lignes depuis une table vers une autre table
Les exemples suivants configurent la journalisation des erreurs DML pour les tables et montrent comment les erreurs sont journalisées dans les tables d’erreurs :
Erreurs de journalisation lors de l’insertion directe de lignes¶
L’exemple suivant enregistre les erreurs lors de l’insertion de lignes directement dans une table :
Créer une table et activez la journalisation des erreurs DML pour celle-ci :
Exécutez une instruction INSERT qui tente d’insérer plusieurs lignes, y compris des valeurs valides et non valides :
Interrogez la table pour confirmer qu’une ligne valide a été insérée :
Interrogez la table d’erreurs pour la table de base
test_dml_error_loggingpour voir les erreurs qui ont été consignées :Désactivez la journalisation des erreurs DML pour la table
test_dml_error_logging:Tentez la même instruction INSERT que vous avez exécutée précédemment. Une erreur est renvoyée et aucune erreur n’est consignée dans une table d’erreurs :
Erreurs de journalisation lors de l’insertion de lignes depuis une table vers une autre table¶
L’exemple suivant enregistre les erreurs lors de l’insertion de lignes depuis une table vers une autre table :
Créez une table source et insérez des valeurs :
Créez une table cible avec la même définition que la table source :
Activez la journalisation des erreurs DML sur la table
dml_error_logging_target:Insérez des valeurs dans la table cible en interrogeant la table source de sorte que l’une des insertions entraîne une division par une erreur zéro :
Interrogez la table pour confirmer que deux lignes valides ont été insérées :
Interrogez la table d’erreurs pour la table de base
dml_error_logging_targetpour voir les erreurs qui ont été consignées :
Journalisation des erreurs et tables d’erreurs¶
Lorsque la journalisation des erreurs est activée pour une table, Snowflake crée automatiquement une table d’erreurs associée à la table de base. Les opérations DML qui rencontrent des erreurs prises en charge enregistrent les erreurs dans la table d’erreurs au lieu d’échouer.
Lorsque la journalisation des erreurs DML est activée pour une table, les types d’instructions DML suivants sont enregistrés :
Une seule table INSERT
UPDATE
MERGE
Les tables d’erreurs ont une définition fixe et ne sont accessibles qu’au propriétaire de la table de base ou à un rôle qui s’est vu accorder le privilège SELECT ERROR TABLE sur la table de base. Les seules opérations directes prises en charge sur une table d’erreurs sont les instructions SELECT et TRUNCATE. Vous ne pouvez pas exécuter d’autres types d’instructions directement sur les tables d’erreurs. Les tables d’erreurs ne peuvent pas être utilisées indirectement dans les vues matérialisées ou les tables dynamiques.
Vous pouvez copier les données de la table d’erreurs vers d’autres tables. Vous pouvez supprimer les données d’une table d’erreurs en exécutant la commande TRUNCATE.
Les sections suivantes fournissent plus d’informations sur la journalisation des erreurs et les tables d’erreurs :
Définition des tables d’erreurs¶
Snowflake crée des tables d’erreurs avec une définition standard qui ne peut pas être modifiée.
Lorsque vous désactivez la journalisation des erreurs DML d’une table de base ou que vous supprimez une table de base qui contient une table d’erreurs, la table d’erreurs associée à la table de base est supprimée automatiquement.
Une table d’erreurs comporte les colonnes suivantes :
Nom |
Type |
Description |
|---|---|---|
|
TIMESTAMP |
L’horodatage de l’instruction qui a déclenché l’erreur. |
|
VARCHAR |
L’ID unique de l’instruction qui a déclenché l’erreur. |
|
NUMBER |
Le code de l’erreur. Lorsque plusieurs colonnes d’une ligne contiennent des erreurs, cette colonne ne capture que la première erreur rencontrée. |
|
OBJECT |
Les métadonnées de l’erreur. Les valeurs OBJECT ont la structure suivante : La valeur OBJECT contient les paires clé-valeur suivantes :
Lorsque plusieurs colonnes d’une ligne contiennent des erreurs, cette colonne ne capture que la première erreur rencontrée. |
|
OBJECT |
Les données qui ont causé l’erreur. Les valeurs OBJECT ont la structure suivante : Les valeurs OBJECT contiennent les paires clé-valeur qui représentent chaque colonne de la table de base. La clé est le nom de la colonne. Pour les valeurs de colonnes non valides ayant causé l’échec de l’opération DML, la valeur de la paire clé-valeur est un tableau qui contient les valeurs. Les valeurs valides sont affichées directement ; autrement dit, elles ne sont pas affichées dans les tableaux. Si les données ne peuvent pas être représentées dans une valeur OBJECT, la valeur est NULL. |
Interagir avec des tables d’erreurs¶
Vous pouvez exécuter des instructions SELECT et TRUNCATE sur les tables d’erreurs en utilisant la syntaxe suivante :
Où :
base_table_nameLe nom de la table pour laquelle la table d’erreurs a été créée.
Par exemple, si le nom de la table de base est my_table, l’instruction suivante interroge la table d’erreurs pour cette table de base :
L’instruction suivante tronque la table d’erreurs :
Exigences en matière de contrôle d’accès pour les tables d’erreur¶
Tout rôle pouvant effectuer des insertions dans une table de base peut déclencher des insertions dans sa table d’erreurs. Quel que soit le rôle actuel, les insertions directes dans une table d’erreurs ne sont pas autorisées.
Les utilisateurs suivants peuvent exécuter des instructions SELECT sur une table d’erreurs :
Le propriétaire de la table de base de la table d’erreurs.
Les utilisateurs qui se sont vus accorder le privilège SELECT ERROR TABLE sur la table de base, soit via un rôle, soit directement.
Pour accorder le privilège SELECT ERROR TABLE sur une table de base, exécutez une instruction GRANT <privilèges> … TO ROLE ou une instruction GRANT <privilèges> … TO USER.
Ces instructions utilisent la syntaxe suivante :
Par exemple, pour accorder le privilège SELECT ERROR TABLE sur une table de base nommée
mybasetableà un rôle nommémyrole, exécutez l’instruction suivante :
Alternativement, pour accorder à d’autres rôles l’accès à une table d’erreurs, le propriétaire de la table de base peut également créer une vue basée sur la table d’erreurs et accorder l’accès à cette vue.
Métadonnées pour la journalisation des erreurs¶
Pour déterminer si la journalisation des erreurs est activée pour une table, vous pouvez exécuter la fonction GET_DDL et transmettre le nom de la table de base :
Par exemple, pour une table de base nommée test_dml_error_logging dans le schéma actuel, exécutez l’instruction suivante :
Les métriques des tables d’erreurs sont enregistrées dans les vues suivantes :
Flux sur les tables d’erreurs¶
Les flux ne sont pas pris en charge directement sur les tables d’erreurs. Pour activer le suivi des modifications sur les tables d’erreurs, créez d’abord une vue sur la table d’erreurs, puis créez un flux sur la vue.
L’exemple suivant vous montre comment activer le suivi des modifications sur les tables d’erreurs :
Exécutez la commande CREATE VIEW pour créer une vue sur la table d’erreurs :
Exécutez la commande CREATE STREAM pour créer un flux sur la vue :
Notes sur l’utilisation de la journalisation des erreurs DML¶
Les notes sur l’utilisation suivantes s’appliquent lorsque la journalisation des erreurs est activée pour une table :
Seules les erreurs directement liées à la table de base sont consignées.
Les types d’erreurs suivants sont consignés :
Violations des contraintes de table NOT NULL.
Erreurs de conversion de type qui se produisent lors d’une tentative de conversion d’une valeur vers la colonne de la table de base.
Valeurs de précision et d’échelle incompatibles.
Longueur incompatible pour les types chaîne et binaire.
Certains échecs d’évaluation d’expressions, telles que la division par zéro ou les défaillances de la fonction PARSE_JSON.
Les instructions multi-tables INSERT et CREATE TABLE … AS SELECT (CTAS) s’exécutent normalement. Elles échouent sur les erreurs DML et ne les enregistrent pas.
Si vous essayez d’exécuter une instruction COPY INTO sur une table avec la journalisation des erreurs activée, l’erreur
Error logging is not supported in statement 'COPY INTO'est renvoyée au moment de la compilation.Les erreurs qui ne sont pas prises en charge par la journalisation des erreurs DML provoquent directement l’échec de l’opération DML.
Si une instruction SQL entraîne une erreur de compilation, l’opération se termine et aucune erreur n’est consignée dans la table d’erreurs.
Les échecs qui se produisent dans d’autres chemins d’ingestion, tels que COPY et Snowpipe, ne sont pas enregistrés dans les tables d’erreurs. Pour la journalisation des erreurs hautes performances Snowpipe Streaming, consultez Journalisation des erreurs dans Snowpipe Streaming avec architecture hautes performances.
Les considérations suivantes concernent la journalisation des erreurs DML et les performances :
Lorsque la journalisation des erreurs DML est activée pour une table de base et qu’il n’y a pas d’erreurs dans une instruction DML qui est exécutée sur la table de base, aucune différence de performances n’est à prévoir, ou bien celle-ci est minime.
Lorsque la journalisation des erreurs DML est activée pour une table de base et qu’il y a des erreurs dans une instruction DML qui est exécutée sur la table de base, du temps supplémentaire est nécessaire pour terminer l’instruction DML, car les informations relatives aux erreurs sont insérées dans la table d’erreurs.
Lorsqu’une table de base avec une table d’erreurs associée est clonée, le comportement est le suivant :
Le schéma et le contenu de la table de base sont clonés.
Le contenu de la table d’erreurs n’est pas cloné.
La table de base clonée comporte la propriété ERROR_LOGGING activée, ce qui crée implicitement une table d’erreurs vide pour elle.
Détection de schémas de définitions de colonnes depuis des fichiers de données semi-structurées en zone de préparation¶
Les données semi-structurées peuvent comprendre des milliers de colonnes. Snowflake fournit des solutions robustes pour traiter ces données. Les options comprennent le référencement des données directement dans le stockage dans le Cloud à l’aide de tables externes, le chargement des données dans une colonne unique de type VARIANT ou la transformation et le chargement des données dans des colonnes distinctes d’une table relationnelle standard. Toutes ces options nécessitent une certaine connaissance des définitions de colonnes dans les données.
Une autre solution consiste à détecter automatiquement le schéma d’un ensemble de fichiers de données semi-structurées en zone de préparation et à récupérer les définitions des colonnes. Les définitions de colonnes comprennent les noms, les types de données et l’ordre des colonnes dans les fichiers. Générez la syntaxe dans un format adapté à la création de tables standard Snowflake, de tables externes ou de vues.
Note
Cette fonction prend en charge les fichiers Apache Parquet, Apache Avro, ORC, JSON et CSV.
Cette prise en charge est mise en œuvre par le biais des fonctions SQL suivantes :
- INFER_SCHEMA
Détecte les définitions de colonnes dans un ensemble de fichiers de données en zone de préparation et récupère les métadonnées dans un format adapté à la création d’objets Snowflake.
- GENERATE_COLUMN_DESCRIPTION
Génère une liste de colonnes à partir d’un ensemble de fichiers en zone de préparation en utilisant la sortie de la fonction INFER_SCHEMA.
Ces fonctions SQL prennent en charge les zones de préparation internes et externes.
Créez des tables ou des tables externes avec les définitions de colonnes dérivées d’un ensemble de fichiers en zone de préparation en utilisant la syntaxe CREATE TABLE … USING TEMPLATE ou CREATE EXTERNAL TABLE … USING TEMPLATE. La clause USING TEMPLATE accepte une expression qui appelle la fonction INFER_SCHEMA SQL pour détecter les définitions de colonnes dans les fichiers. Une fois la table créée, vous pouvez alors utiliser une instruction COPY avec l’option MATCH_BY_COLUMN_NAME pour charger des fichiers directement dans la table structurée.
La détection des schémas peut également être utilisée en conjonction avec l’évolution du schéma de table, où la structure des tables évolue automatiquement pour prendre en charge la structure des nouvelles données reçues des sources de données.
Alternatives au chargement de données¶
Vous pouvez utiliser l’option suivante pour interroger vos données dans le stockage dans le Cloud sans les charger dans des tables Snowflake.
Tables externes (data lake)¶
Les tables externes permettent d’interroger des données existantes stockées dans un stockage Cloud externe à des fins d’analyse sans avoir à d’abord les charger dans Snowflake. La source de vérité pour les données demeure dans le stockage Cloud externe. Les ensembles de données matérialisés dans Snowflake via des vues matérialisées sont en lecture seule.
Cette solution est particulièrement avantageuse pour les comptes qui ont une grande quantité de données stockées dans un stockage Cloud externe et qui ne souhaitent interroger qu’une partie des données, par exemple, les données les plus récentes. Les utilisateurs peuvent créer des vues matérialisées sur des sous-ensembles de ces données pour améliorer les performances des requêtes.
Utilisation d’un stockage compatible avec Amazon S3¶
Vous pouvez créer des tables et des zones de préparation externes dans Snowflake pour accéder au stockage dans une application ou un appareil compatible avec Amazon S3. Cette fonction vous permet de gérer, gouverner et analyser vos données, quel que soit l’endroit où elles sont stockées. Pour plus d’informations, voir Work with Amazon S3-compatible storage.