Tables dynamiques

Les tables dynamiques sont les éléments constitutifs des pipelines déclaratifs de transformation des données. Elles simplifient considérablement l’ingénierie des données dans Snowflake et fournissent un moyen fiable, rentable et automatisé de transformer vos données pour la consommation. Au lieu de définir les étapes de transformation des données comme une série de tâches et de devoir surveiller les dépendances et la planification, vous pouvez simplement définir l’état final de la transformation à l’aide de tables dynamiques et laisser la gestion complexe du pipeline de données à Snowflake.

Cette rubrique présente les concepts des tables dynamiques et explique comment transformer des données dans un pipeline de données continu à l’aide de tables dynamiques.

Une table dynamique est une table qui matérialise les résultats d’une requête que vous spécifiez. Plutôt que de créer une table cible distincte et d’écrire du code pour transformer et mettre à jour les données de cette table, vous pouvez définir la table cible comme une table dynamique et spécifier l’instruction SQL qui effectue la transformation. Un processus automatisé met automatiquement à jour les résultats matérialisés par des actualisations régulières (et souvent incrémentielles). Pour plus de détails sur l’actualisation dynamique des tables, consultez Présentation de l’actualisation dynamique des tables.

Le contenu d’une table dynamique étant entièrement déterminé par la requête donnée, il ne peut pas être modifié à l’aide de DML. Vous n’insérez pas, ne mettez pas à jour et ne supprimez pas les lignes d’une table dynamique. Le processus d’actualisation automatisé matérialise les résultats de la requête dans une table dynamique.

Les sections suivantes expliquent les concepts qui sous-tendent les tables dynamiques :

Note

La réplication d’une base de données contenant des tables dynamiques n’est pas prise en charge. Si une base de données contient des tables dynamiques, la réplication de cette base de données échouera. Pour contourner cette limitation, vous devez supprimer toutes les tables dynamiques dans la base de données avant de répliquer la base de données.

Un exemple simple

L’exemple présenté dans Transformation des données JSON chargées dans une planification utilise des flux et des tâches pour transformer et insérer de nouvelles données dans deux tables cibles (name et visits) pendant que les données sont diffusées dans une table d’arrivée (raw).

La table suivante montre comment effectuer la même transformation à l’aide de tables dynamiques.

Instructions SQL pour les flux et les tâches

Instructions SQL pour les tables dynamiques

-- Create a landing table to store
-- raw JSON data.
CREATE OR REPLACE TABLE raw
  (var VARIANT);

-- Create a stream to capture inserts
-- to the landing table.
CREATE OR REPLACE STREAM rawstream1
  ON TABLE raw;

-- Create a table that stores the names
-- of office visitors from the raw data.
CREATE OR REPLACE TABLE names
  (id INT,
   first_name STRING,
   last_name STRING);

-- Create a task that inserts new name
-- records from the rawstream1 stream
-- into the names table.
-- Execute the task every minute when
-- the stream contains records.
CREATE OR REPLACE TASK raw_to_names
  WAREHOUSE = mywh
  SCHEDULE = '1 minute'
  WHEN
    SYSTEM$STREAM_HAS_DATA('rawstream1')
  AS
    MERGE INTO names n
      USING (
        SELECT var:id id, var:fname fname,
        var:lname lname FROM rawstream1
      ) r1 ON n.id = TO_NUMBER(r1.id)
      WHEN MATCHED AND metadata$action = 'DELETE' THEN
        DELETE
      WHEN MATCHED AND metadata$action = 'INSERT' THEN
        UPDATE SET n.first_name = r1.fname, n.last_name = r1.lname
      WHEN NOT MATCHED AND metadata$action = 'INSERT' THEN
        INSERT (id, first_name, last_name)
          VALUES (r1.id, r1.fname, r1.lname);
Copy
-- Create a landing table to store
-- raw JSON data.
CREATE OR REPLACE TABLE raw
  (var VARIANT);

-- Create a dynamic table containing the
-- names of office visitors from
-- the raw data.
-- Try to keep the data up to date within
-- 1 minute of real time.
CREATE OR REPLACE DYNAMIC TABLE names
  TARGET_LAG = '1 minute'
  WAREHOUSE = mywh
  AS
    SELECT var:id::int id, var:fname::string first_name,
    var:lname::string last_name FROM raw;
Copy

Comme le montre l’exemple précédent, lors de la création d’une table dynamique, vous spécifiez la requête pour les résultats que vous souhaitez voir. Pour l’actualisation incrémentielle des données, vous n’avez pas besoin de créer un flux pour suivre les modifications ni d’écrire une tâche pour examiner ces modifications et les appliquer à la table cible. Le processus d’actualisation automatisé le fait pour vous, sur la base de la requête que vous avez spécifiée.

Quand utiliser les tables dynamiques ?

Il existe un certain nombre de méthodes que vous pouvez utiliser pour transformer les données dans votre pipeline (par exemple, les flux et les tâches, les CTAS, vos propres solutions personnalisées, etc.) Les tables dynamiques sont une méthode possible pour transformer vos données.

Les tables dynamiques sont utilisées de préférence dans les cas où :

  • Vous ne voulez pas écrire de code pour suivre les dépendances des données et gérer l’actualisation des données.

  • Vous souhaitez éviter la complexité relative aux flux et aux tâches, et vous n’en avez pas besoin.

  • Vous n’avez pas besoin d’un contrôle précis de la programmation des actualisations.

  • Vous devez matérialiser les résultats d’une requête portant sur plusieurs tables de base.

  • Vous n’avez pas besoin d’utiliser des constructions de requêtes dynamiques non prises en charge, telles que les procédures stockées, les fonctions non déterministes non répertoriées dans Fonctions non déterministes prises en charge dans les tables dynamiques, ou les fonctions externes.

Note

Les tables dynamiques peuvent être utilisées avec des flux. Utilisé conjointement, un flux basé sur une table dynamique fonctionne comme n’importe quel autre flux. Pour plus d’informations et d’exemples, voir Flux et tables dynamiques.

Fonctionnement des tables dynamiques

Lors de la création d’une table dynamique, vous indiquez la requête qui doit être utilisée pour transformer les données d’une ou de plusieurs tables de base ou dynamiques. Un processus d’actualisation automatisé exécute régulièrement cette requête et met à jour la table dynamique en fonction des modifications apportées aux tables de base.

Comparison between streams / tasks and dynamic tables

Ce processus automatisé calcule les modifications apportées aux tables de base et les fusionne dans la table dynamique. Pour effectuer ce travail, le processus utilise les ressources de calcul de l’entrepôt que vous associez à la table dynamique.

Lors de la création d’une table dynamique, vous spécifiez une cible de niveau d’actualisation pour les données (une latence cible). Par exemple, vous pouvez spécifier que les données doivent avoir un retard maximum de 5 minutes par rapport aux mises à jour de la table de base. Sur la base de ce niveau d’actualisation cible, le processus automatisé met en place des actualisations afin que les données de la table dynamique soient mises à jour dans les limites de cette cible (par exemple, dans les 5 minutes suivant les mises à jour de la table de base).

Si les données n’ont pas besoin d’être aussi actuelles, vous pouvez spécifier un niveau d’actualisation cible plus long afin de réduire les coûts. Par exemple, si les données de la table cible doivent avoir au maximum une heure de retard sur les mises à jour des tables de base, vous pouvez spécifier un niveau d’actualisation cible d’une heure (au lieu de 5 minutes) pour réduire les coûts.

Enchaîner des pipelines de tables dynamiques

Vous pouvez configurer une table dynamique pour interroger d’autres tables dynamiques.

Par exemple, supposons que votre pipeline de données récupère des données d’une table de mise en zone de préparation pour mettre à jour des tables de dimension distinctes pour les données relatives aux consommateurs, aux produits et à la date et à l’heure. Supposons que votre pipeline mette également à jour une table contenant des données de vente agrégées, basées sur ces tables de dimension.

Vous pouvez configurer les tables de dimension comme des tables dynamiques qui interrogent la table de mise en zone de préparation. Vous pouvez ensuite configurer la table des ventes agrégées comme une table dynamique qui interroge les tables de dimensions.

Ceci est similaire à la manière dont vous pouvez définir un graphe orienté acyclique (DAG) de tâches. Dans un DAG de tâches, la tâche de mise à jour de la table des ventes agrégées ne s’exécute que si les tâches de mise à jour des tables de dimensions ont été exécutées sans erreur.

Comparison between DAGs for streams / tasks and dynamic tables

Si une table dynamique interroge une autre table dynamique, le processus d’actualisation automatisé met à jour toutes les tables dynamiques dépendantes au moment opportun afin de garantir que leurs objectifs de latence soient atteints et que les données soient cohérentes.

Présentation des privilèges requis pour les tables dynamiques

Les sections suivantes expliquent les privilèges requis pour créer et utiliser des tables dynamiques :

Privilèges des tables dynamiques

La table suivante décrit les privilèges requis pour la gestion des tables dynamiques :

Privilège

Utilisation

SELECT

Permet d’exécuter une instruction SELECT sur une table dynamique.

MONITOR

Permet de voir les détails de la table dynamique (en utilisant DESCRIBE DYNAMIC TABLE ou la page de détails des tables dynamiques dans Snowsight) et d’afficher les tables auxquelles vous avez accès (en utilisant SHOW DYNAMIC TABLES).

OPERATE

Permet de voir les détails de la table dynamique (à l’aide de DESCRIBE DYNAMIC TABLE) et de modifier les propriétés suivantes : WAREHOUSE et TARGET_LAG.

OWNERSHIP

Donne un contrôle total de la table dynamique. Nécessaire pour modifier les propriétés d’une table dynamique. Un seul rôle peut détenir ce privilège sur un objet spécifique à la fois.

ALL [ PRIVILEGES ]

Accorde tous les privilèges, sauf OWNERSHIP, sur la table dynamique.