Combiner et optimiser des données

Effectué

Les organisations compilent souvent différents types d’informations provenant de nombreuses sources. Les informations sont stockées dans un grand nombre de tables. Parfois, vous pouvez avoir besoin de joindre les tables en fonction de leurs relations logiques, pour faire une analyse approfondie ou créer des rapports. Dans le scénario d’entreprise de distribution, vous utilisez des tables pour les informations des clients, des produits et des ventes.

Dans ce module, vous découvrez différentes façons de combiner des données dans des requêtes Kusto pour fournir aux membres de votre équipe les informations dont ils ont besoin pour accroître la notoriété des produits et augmenter les ventes.

Comprendre vos données

Avant de commencer à écrire des requêtes qui combinent des informations de vos tables, vous devez comprendre vos données. Quand vous travaillez avec des requêtes Kusto, vous allez considérer que les tables appartiennent à une des deux catégories suivantes :

  • Tables de faits : tables dont les enregistrements sont des faits immuables, comme la table SalesFact dans le scénario d’entreprise de vente au détail. Dans ces tables, les enregistrements sont progressivement ajoutés en streaming ou sous forme de gros segments. Les enregistrements restent dans la table jusqu’à ce qu’ils soient supprimés et ils ne sont jamais mis à jour.
  • Tables de dimension : tables dont les enregistrements sont des dimensions mutables, comme les tables Customers et Products dans le scénario d’entreprise de vente au détail. Ces tables contiennent des données de référence, comme des tables de choix entre un identificateur d’entité et ses propriétés. Les tables de dimension ne reçoivent pas régulièrement de mises à jour avec de nouvelles données.

Dans notre scénario d’entreprise de distribution, vous utilisez des tables de dimension pour enrichir la table SalesFact avec des informations supplémentaires ou pour fournir davantage d’options de filtrage des données pour les requêtes.

Vous devez également comprendre les volumes de données que vous utilisez et leur structure, appelée « schéma » (les noms et les types des colonnes). Vous pouvez exécuter les requêtes suivantes pour obtenir ces informations en remplaçant TABLE_NAME par le nom de la table que vous examinez :

  • Pour obtenir le nombre d’enregistrements dans une table, utilisez l’opérateur count :

    TABLE_NAME
    | count
    
  • Pour obtenir le schéma d’une table, utilisez l’opérateur getschema :

    TABLE_NAME
    | getschema
    

L’exécution de ces requêtes sur les tables de faits et de dimension dans le scénario d’entreprise de distribution vous donne des informations comme dans l’exemple suivant :

Table Enregistrements schéma
SalesFact 2 832 193 - SalesAmount (real)
- TotalCost (real)
- DateKey (datetime)
- ProductKey (long)
- CustomerKey (long)
Clients 18 484 - CityName (string)
- CompanyName (string)
- ContinentName (string)
- CustomerKey (long)
- Education (string)
- FirstName (string)
- Gender (string)
- LastName (string)
- MaritalStatus (string)
- Occupation (string)
- RegionCountryName (string)
- StateProvinceName (string)
Produits 2 517 - ProductName (string)
- Manufacturer (string)
- ColorName (string)
- ClassName (string)
- ProductCategoryName (string)
- ProductSubcategoryName (string)
- ProductKey (long)

Dans la table, nous avons mis en évidence les identificateurs uniques CustomerKey et ProductKey qui sont utilisés pour combiner les enregistrements entre les tables.

Comprendre les requêtes multitables

Après avoir analysé vos données, vous devez comprendre comment combiner des tables pour fournir les informations dont vous avez besoin. Les requêtes Kusto fournissent plusieurs opérateurs pour combiner des données de plusieurs tables, notamment les opérateurs lookup, join et union.

L’opérateur join fusionne les lignes de deux tables en mettant en correspondance les valeurs des colonnes spécifiées de chaque table. La table résultante dépend du type de jointure que vous utilisez. Par exemple, si vous utilisez une jointure interne, la table a les mêmes colonnes que la table de gauche (parfois appelée table externe), plus les colonnes de la table de droite (parfois appelée table interne). Vous en apprendrez plus sur les types de jointures dans la section suivante. Pour de meilleures performances, si une table est toujours plus petite que l’autre, utilisez-la à gauche de l’opérateur join.

L’opérateur lookup est une implémentation spéciale de l’opérateur join qui optimise les performances des requêtes où une table de faits est enrichie avec les données d’une table de dimensions. Cela étend la table de faits avec des valeurs recherchées dans une table de dimension. Pour de meilleures performances, le système suppose par défaut que la table de gauche est la plus grande (fait) et que la table de droite est la plus petite (dimension). Cette supposition est exactement à l’opposé de celle utilisée par l’opérateur join.

L’opérateur union retourne toutes les lignes d’au moins deux tables. Il est utile pour combiner des données de plusieurs tables.

La fonction materialize() met en cache les résultats dans une exécution de requête pour pouvoir les réutiliser plus tard dans la requête. C’est comme si vous preniez un instantané des résultats d’une sous-requête et que vous l’utilisiez plusieurs fois dans la requête. Cette fonction est utile pour optimiser les requêtes dans des scénarios où les résultats :

  • Sont chers à calculer
  • Sont non déterministes

Vous en apprendrez bientôt davantage sur les différents opérateurs de fusion de tables et sur la fonction materialize(), et comment les utiliser.

Types de jointure

Diagram showing query join kinds.

De nombreux types de jointure affectent le schéma et les lignes de la table résultante. Le tableau suivant indique les types de jointure pris en charge par le langage de requête Kusto, et le schéma et les lignes qu’ils retournent :

Type de jointure Description Illustration
innerunique (valeur par défaut) Jointure interne avec déduplication du côté gauche
Schéma : toutes les colonnes des deux tables, y compris les clés correspondantes
Lignes : toutes les lignes dédupliquées de la table de gauche qui correspondent aux lignes de la table de droite
inner Jointure interne standard
Schéma : toutes les colonnes des deux tables, y compris les clés correspondantes
Lignes : seules les lignes correspondantes des deux tables
leftouter Jointure externe gauche
Schéma : toutes les colonnes des deux tables, y compris les clés correspondantes
Lignes : tous les enregistrements de la table de gauche et uniquement les lignes correspondantes de la table de droite
rightouter Jointure externe droite
Schéma : toutes les colonnes des deux tables, y compris les clés correspondantes
Lignes : tous les enregistrements de la table de droite et uniquement les lignes correspondantes de la table de gauche
fullouter Jointure externe entière
Schéma : toutes les colonnes des deux tables, y compris les clés correspondantes
Lignes : tous les enregistrements des deux tables avec des cellules sans correspondance remplies avec null
leftsemi Semi-jointure gauche
Schéma : toutes les colonnes de la table de gauche
Lignes : tous les enregistrements de la table de gauche qui correspondent aux enregistrements de la table de droite
leftanti, anti, leftantisemi Jointure anti gauche et semi-variante
Schéma : toutes les colonnes de la table de gauche
Lignes : tous les enregistrements de la table de gauche qui ne correspondent pas aux enregistrements de la table de droite
rightsemi Semi-jointure droite
Schéma : toutes les colonnes de la table de droite
Lignes : tous les enregistrements de la table de droite qui correspondent aux enregistrements de la table de gauche
rightanti, rightantisemi Jointure anti droite et semi-variante
Schéma : toutes les colonnes de la table de droite
Lignes : tous les enregistrements de la table de droite qui ne correspondent pas aux enregistrements de la table de gauche

Notez que le type de jointure par défaut est innerunique et n’a pas besoin d’être spécifié. Néanmoins, une bonne pratique est de toujours spécifier explicitement le type de jointure pour plus de clarté.

Au fil de ce module, vous découvrez également les fonctions d’agrégation arg_min() et arg_max(), l’opérateur as comme alternative à l’instruction let, et la fonction startofmonth() pour faciliter le regroupement des données par mois.