Aller au contenu principal

Modélisez les données semi-structurées

Cet article recommande des modèles pour stocker des données semi-structurées en fonction de la manière dont votre organisation utilise les données. Databricks fournit des fonctions, des types de données natifs et une syntaxe de query pour travailler avec des données semi-structurées, imbriquées et complexes.

Les considérations suivantes déterminent le modèle que vous devriez utiliser :

  • Les champs ou les types de la source de données changent-ils fréquemment ?
  • Combien de champs uniques au total sont contenus dans la source de données ?
  • Devez-vous optimiser vos charges de travail pour les écritures ou les lectures?

Databricks recommande de stocker les données sous forme de tables Delta pour les queries en aval.

Utiliser la variante

Avec Databricks Runtime 15.3 et versions ultérieures, vous pouvez utiliser le type VARIANT pour stocker des données JSON semi-structurées à l'aide d'un encodage optimisé qui surpasse les chaînes JSON pour les lectures et les écritures.

Le type VARIANT a des applications similaires aux chaînes JSON. Certaines charges de travail bénéficient toujours de l'utilisation de structs, de maps et de tableaux, en particulier pour les données avec des schémas bien connus qui bénéficieraient d'un Layout optimisé des données et d'une collecte de statistiques.

Pour plus de détails, consultez les articles suivants :

Utilisez les chaînes JSON

Vous pouvez stocker des données dans une seule colonne de chaîne en utilisant le formatage JSON standard et ensuite interroger des champs dans le JSON en utilisant la notation :.

De nombreux systèmes produisent des enregistrements JSON codés en chaîne ou en octets. L'ingestion et le stockage de ces enregistrements sous forme de chaînes entraînent une très faible charge de traitement. Vous pouvez également utiliser la fonction to_json pour transformer n'importe quelle structure de données en chaîne JSON.

Tenez compte des points forts et des points faibles suivants lorsque vous choisissez de stocker des données sous forme de chaînes JSON :

  • Toutes les valeurs sont stockées sous forme de chaînes de caractères sans informations de type.
  • JSON prend en charge tous les types de données qui peuvent être représentés à l'aide de texte.
  • JSON prend en charge les chaînes de caractères de longueur arbitraire.
  • Il n'y a pas de limites sur le nombre de champs qui peuvent être représentés dans une seule colonne de données JSON.
  • Les données ne nécessitent aucun prétraitement avant d'écrire dans la table.
  • Vous pouvez résoudre les problèmes de type présents dans les données dans les workloads en aval.
  • JSON offre les pires performances en lecture, car vous devez analyser la chaîne entière pour chaque query.

Les chaînes JSON offrent une grande flexibilité et une solution facile à mettre en œuvre pour introduire des données brutes dans une table lakehouse. Vous pouvez choisir d'utiliser les chaînes JSON pour de nombreuses applications, mais elles sont particulièrement utiles lorsque le résultat le plus important d'une charge de travail est de stocker une représentation complète et précise d'une source de données pour le traitement en aval. Voici quelques cas d'usage possibles :

  • Ingestion de données de streaming à partir d'un service de file d'attente tel que Kafka.
  • Enregistrement des réponses des requêtes de l'API REST.
  • Stockage d'enregistrements bruts provenant d'une source de données amont non contrôlée par votre équipe.

En supposant que votre logique d’ingestion est flexible, le stockage des données sous forme de chaîne JSON devrait être résilient, même si vous rencontrez de nouveaux champs, des changements dans la structure des données ou des changements de type dans la source de données. Bien que les charges de travail en aval puissent échouer en raison de ces changements, votre table contient un historique complet des données source, ce qui signifie que vous pouvez corriger les problèmes sans avoir à revenir à la source de données.

Utilisez les structures

Vous pouvez stocker des données semi-structurées avec des structures et activer toutes les fonctionnalités natives des colonnes tout en conservant la structure imbriquée de la source de données.

Delta Lake vous permet d'utiliser des structs de la même manière que des colonnes. Dans une table Delta Lake, les fichiers de données Parquet créent une colonne pour chaque champ d'une structure. Vous pouvez utiliser des champs de structure comme clés de clustering et collecter des statistiques sur les structures pour l'omission de données. Vous ne pouvez pas partitionner une table par un champ de structure. Utilisez plutôt le clustering liquide. Voir Utiliser le clustering liquide pour les tables.

Les structures offrent généralement les meilleures performances en lecture, car elles prennent en charge toutes les optimisations de saut de données et stockent les champs individuels sous forme de colonnes. Les performances peuvent commencer à se dégrader lorsque le nombre de colonnes présentes atteint des centaines.

Chaque champ d'une structure a un type de données, qui est appliqué lors de l'écriture de la même manière que pour les colonnes. Ainsi, les structs nécessitent un prétraitement complet des données. Ceci peut être bénéfique lorsque vous ne souhaitez que des données validées validées dans une table, mais peut entraîner des pertes de données ou des échecs de jobs lors du traitement d'enregistrements mal formés provenant de systèmes en amont.

Les structs sont moins flexibles que les Streams JSON pour l'évolution des schémas, que ce soit pour les types de données évolutifs ou l'ajout de nouveaux champs.

Utiliser des cartes et des tableaux

Vous pouvez utiliser une combinaison de cartes et de tableaux pour répliquer les formats de données semi-structurées en mode natif dans Delta Lake. Les statistiques ne peuvent pas être collectées sur les champs définis avec ces types, mais elles offrent des performances équilibrées en lecture et en écriture pour les datasets semi-structurés qui ont environ 500 champs.

La clé et la valeur des mappages sont toutes deux typées, de sorte que les données sont prétraitées et le schéma est appliqué lors de l'écriture.

Pour accélérer les queries, Databricks recommande de stocker les champs fréquemment utilisés pour filtrer les données sous forme de colonnes séparées.

Dois-je aplanir mes données ?

Si vous stockez vos données à l'aide de JSON ou de cartes, envisagez de stocker les champs fréquemment utilisés pour le filtrage des queries en tant que colonnes. La collecte de statistiques, le partitionnement et le clustering ne sont pas disponibles pour les champs dans les chaînes JSON ou les cartes. Il n'est pas nécessaire de faire cela pour les données stockées sous forme de structs.

Syntaxe pour travailler avec des données imbriquées

Consultez les ressources suivantes pour obtenir des informations sur l'utilisation de données imbriquées :