Introduction aux données semi-structurées

Cette rubrique décrit les données semi-structurées et fournit des informations sur la manière de les charger et de les stocker dans Snowflake.

Dans ce chapitre :

Que sont les données semi-structurées ?

Les données semi-structurées sont des données qui ne sont pas conformes aux normes des données structurées classiques, mais qui contiennent des balises (libellés) ou d’autres types de balisage qui identifient des entités individuelles et distinctes dans les données.

Deux des attributs de clé qui distinguent les données semi-structurées des données structurées sont les structures de données imbriquées et l’absence d’un schéma fixe :

  • Les données structurées nécessitent un schéma fixe qui est défini avant que les données puissent être chargées et interrogées dans un système de base de données relationnelle. Les données semi-structurées ne nécessitent pas de définition préalable d’un schéma et peuvent évoluer constamment (c’est-à-dire que de nouveaux attributs peuvent être ajoutés à tout moment).

    De plus, les entités d’une même classe peuvent avoir des attributs différents même si elles sont regroupées, et l’ordre des attributs ne joue aucun rôle.

  • Contrairement aux données structurées, qui représentent les données sous forme de table plate, les données semi-structurées peuvent contenir des hiérarchies d’informations imbriquées à n niveaux.

Que sont les données hiérarchiques ?

Les données semi-structurées sont généralement organisées de manière hiérarchique. Les structures de données complexes peuvent être construites en imbriquant des types de données plus simples, comme les tableaux et les objets. (Remarque : un OBJECT Snowflake correspond à un « dictionnaire » ou à une « carte ». Un objet Snowflake n’est pas un « objet » au sens de la « programmation orientée objet »).

Par exemple, les données JSON peuvent contenir un objet qui contient un tableau. Chaque cellule de ce tableau peut elle-même contenir un objet ou un tableau imbriqué.

Vous pouvez utiliser des types de données Snowflake pour construire une hiérarchie afin de contenir vos données semi-structurées en utilisant les propriétés suivantes des types de données :

  • Un VARIANT peut contenir une valeur de tout autre type de données, y compris un ARRAY ou un OBJECT.

  • Un ARRAY ou OBJECT contient une valeur de type VARIANT.

Par exemple, supposons que vous souhaitiez stocker les dates auxquelles différents types de catastrophes naturelles se sont produites. Vous pouvez créer un OBJECT qui contient les clés « Ouragan », « Tremblement de terre », « Inondation », etc. La valeur associée à chacune de ces clés peut être un ARRAY qui contient les dates auxquelles chaque type de catastrophe s’est produit. Comme la valeur de chaque paire clé-valeur doit être un VARIANT, chaque tableau de dates sera stocké sous la forme d’un ARRAY enveloppé dans un VARIANT à l’intérieur de l’OBJECT correspondant. Le niveau supérieur de la hiérarchie ressemblerait à ce qui suit (les accolades indiquent un OBJECT, qui contient des paires clé-valeur) :

{
    "Flood": flood_date_array::VARIANT,
    "Earthquake": earthquake_date_array::VARIANT,
    ...
}

Autre exemple, supposons que vous souhaitiez stocker une seule liste de catastrophes par ordre chronologique. Dans ce cas, votre type de données externe pourrait être ARRAY. Chaque cellule de cet ARRAY peut contenir un OBJECT (enveloppé dans un VARIANT) qui contient des paires clé-valeur avec des informations sur l’événement. Par exemple, chaque OBJECT décrivant un tremblement de terre peut avoir des clés telles que “Horodatage”, “Emplacement” et “Magnitude”. Chaque OBJECT qui décrit une tornade peut avoir des clés telles que “Horodatage” et “Vitesse_vent_max”.

[
    {
        "Event_ID": 54::VARIANT,
        "Type": "Earthquake"::VARIANT,
        "Magnitude": 7.4::VARIANT,
        "Timestamp": "2018-06-09 12:32:15"::TIMESTAMP_LTZ::VARIANT
        ...
    }::VARIANT,
    {
        "Event_ID": 55::VARIANT,
        "Type": "Tornado"::VARIANT,
        "Maximum_wind_speed": 186::VARIANT,
        "Timestamp": "2018-07-01 09:42:55"::TIMESTAMP_LTZ::VARIANT
        ...
    }::VARIANT
]

Vous pouvez créer des hiérarchies de données de presque n’importe quelle profondeur ou largeur (jusqu’à la limite de stockage pour chaque type de données). Par exemple, un OBJECT qui contient des informations sur une tornade peut avoir besoin d’informations sur la vitesse du vent à différents moments de la tornade, votre structure de données pourrait donc ressembler à ce qui suit :

  1. Le niveau supérieur est un ARRAY.

  2. Chaque cellule de cet ARRAY contient un OBJECT qui décrit une tornade.

  3. Chaque OBJECT contient un ARRAY de données de vitesse du vent.

  4. Chaque cellule de cet ARRAY interne est un OBJECT qui contient des données dont les clés sont les suivantes :

    • Horodatage de la vitesse du vent.

    • Emplacement de la vitesse du vent.

    • La vitesse du vent en KPH (kilomètres par heure).

    Dans certains cas, les données peuvent être incomplètes. Par exemple, si la vitesse du vent à un endroit particulier a été estimée sur la base des dégâts visibles après la tornade (plutôt que mesurée directement pendant la tornade), les données peuvent inclure le lieu et la vitesse du vent, mais pas l’horodatage.

Chargement de données semi-structurées

Snowflake peut importer des données semi-structurées à partir des formats JSON, Avro, ORC, Parquet et XML et les stocker dans des types de données Snowflake conçus spécifiquement pour prendre en charge les données semi-structurées.

En fonction de la structure des données, de leur taille et de la manière dont l’utilisateur choisit d’importer les données, les données semi-structurées peuvent être stockées dans une seule colonne ou réparties en plusieurs colonnes.

Les étapes de chargement des données semi-structurées vers des tables sont similaires à celles du chargement des données structurées vers des tables. Toutefois, lorsque vous chargez et stockez des données semi-structurées, vous pouvez également spécifier explicitement la totalité, une partie ou rien de la structure :

  • Si vos données sont un ensemble de paires clé-valeur, vous pouvez les charger dans une colonne de type OBJECT.

  • Si vos données sont un tableau, vous pouvez les charger dans une colonne de type ARRAY.

  • Si vous avez Que sont les données hiérarchiques ?, vous pouvez faire l’une des choses suivantes :

    • Répartissez les données entre plusieurs colonnes. Vous pouvez :

      • Extraire et transformer explicitement les colonnes de données semi-structurées en colonnes distinctes dans des tables cibles.

      • Utiliser Snowflake pour détecter et récupérer automatiquement les définitions de colonnes à partir des fichiers de données semi-structurées de zone de préparation. Créer des tables Snowflake, des tables externes ou des vues à partir des définitions de colonnes. Pour gagner du temps, créez des tableaux dont les définitions de colonnes sont automatiquement récupérées dans les fichiers en zone de préparation.

        Note

        • Cette fonctionnalité de détection et de récupération est prise en charge en tant que fonctionnalité disponible en avant-première.

        • Cette fonctionnalité de détection et de récupération est actuellement limitée à Apache Parquet, Apache Avro et aux fichiers ORC.

    • Stocker les données dans une seule colonne de type VARIANT. Vous pouvez :

      • Spécifier la structure de manière explicite (par exemple, spécifier une hiérarchie de types de données VARIANT, ARRAY et OBJECT).

      • Charger les données sans spécifier explicitement la structure. Si vous spécifiez un format de données que Snowflake reconnaît et analyse (JSON, Avro, Parquet ou ORC), les données sont converties en un format de données interne qui utilise les types de données VARIANT, ARRAY et OBJECT de Snowflake.

Si les données sont complexes ou si une valeur individuelle nécessite plus d’environ 16MB d’espace de stockage, vous pouvez utiliser plus d’une des techniques précédentes. Par exemple, vous pouvez diviser les données en plusieurs colonnes, et certaines de ces colonnes peuvent contenir une hiérarchie de types de données explicitement spécifiée.

Vous pouvez charger des données semi-structurées des manières suivantes :

  • Spécifiez le format des données d’entrée et le type de données Snowflake lors de la création de la table et du chargement des données. Par exemple, dans le code ci-dessous, le type de données VARIANT est spécifié dans l’instruction CREATE TABLE, tandis que le format des données d’entrée JSON est spécifié dans la clause TYPE = <format_données> de la commande COPY INTO <table> :

    CREATE TABLE my_table (my_variant_column VARIANT);
    COPY INTO my_table ... FILE FORMAT = (TYPE = 'JSON') ...
    
  • Spécifiez le format des données d’entrée et le type de données Snowflake en appelant une fonction appropriée pour convertir les données. Par exemple, pour convertir des données au format JSON en une valeur VARIANT, appelez PARSE_JSON, comme indiqué ci-dessous :

    INSERT INTO my_table (my_variant_column) SELECT PARSE_JSON('{...}');
    

Lorsque les données sont stockées dans des types de données ARRAY, OBJECT ou VARIANT, ou dans une hiérarchie de ces types, vous pouvez les interroger.

Stockage des données semi-structurées

Les données semi-structurées sont généralement stockées dans les types de données Snowflake suivants :

  • ARRAY : similaire à un tableau dans d’autres langages.

  • OBJECT : similaire à un objet JSON, également appelé « dictionnaire », « hachage » ou « map » dans de nombreux langages. Il contient des paires clé-valeur.

  • VARIANT : type de données qui peut contenir une valeur de tout autre type de données (y compris ARRAY et OBJECT). VARIANT est utilisé pour construire et stocker des données hiérarchiques.

(Si les données sont réparties en plusieurs colonnes, avant leur stockage, tout ou partie de ces colonnes peuvent être des types de données simples, tels que FLOAT, VARCHAR, etc.)

Les types de données ARRAY, OBJECT et VARIANT peuvent être utilisés individuellement ou imbriqués pour concevoir une hiérarchie.

Si les données sont importées au format JSON, Avro, ORC ou Parquet, Snowflake peut concevoir la hiérarchie pour vous et la stocker dans un VARIANT. Vous pouvez également créer une hiérarchie manuellement.

Indépendamment de la manière dont la hiérarchie a été conçue, Snowflake convertit les données dans un format de stockage interne optimisé qui utilise ARRAY, OBJECT et VARIANT. Ce format de stockage interne permet une interrogation SQL rapide et efficace.

Vous trouverez plus d’informations sur les types de données ARRAY, OBJECT, et VARIANT dans Types de données semi-structurées.

Interrogation de données semi-structurées

Snowflake prend en charge les opérateurs pour :

Vous trouverez plus d’informations sur l’interrogation des données semi-structurées dans Interrogation de données semi-structurées.

Pour plus d’informations sur l’interrogation XML en spécifiant des balises XML, voir la documentation de la fonction XMLGET.