Transformation de jointure dans le flux de données de mappage

S’APPLIQUE À : Azure Data Factory Azure Synapse Analytics

Conseil

Essayez Data Factory dans Microsoft Fabric, une solution d’analyse tout-en-un pour les entreprises. Microsoft Fabric couvre tous les aspects, du déplacement des données à la science des données, en passant par l’analyse en temps réel, l’aide à la décision et la création de rapports. Découvrez comment démarrer un nouvel essai gratuitement !

Les flux de données sont disponibles à la fois dans les pipelines Azure Data Factory et Azure Synapse. Cet article s’applique aux flux de données de mappage. Si vous débutez dans le domaine des transformations, consultez l’article d’introduction Transformer des données avec un flux de données de mappage.

Utilisez la transformation de jointure pour combiner des données de deux sources ou flux dans un flux de données de mappage. Le flux de sortie inclut toutes les colonnes des deux sources correspondantes en fonction d’une condition de jointure.

Types de jointure

Le mappage de flux de données prend actuellement en charge cinq types de jointures différents.

Jointure interne (Inner)

La jointure interne génère uniquement les lignes possédant des valeurs correspondantes dans les deux tables.

Externe gauche

La jointure externe gauche renvoie toutes les lignes du flux de données gauche et les enregistrements correspondants du flux de droite. Si une ligne du flux de gauche n’a pas de correspondance, les colonnes de sortie du flux de droite ont pour valeur NULL. La sortie contient les lignes renvoyées par la jointure interne ainsi que les lignes sans correspondance du flux de gauche.

Notes

Le moteur Spark utilisé par les flux de données échouera parfois en raison d’éventuels produits cartésiens dans vos conditions de jointure. Le cas échéant, vous pouvez basculer vers une jointure croisée personnalisée et entrer manuellement votre condition de jointure. Cela peut entraîner un ralentissement des performances dans vos flux de données, car le moteur d’exécution peut avoir besoin de calculer toutes les lignes des deux côtés de la relation, puis filtrer les lignes.

Externe droite

La jointure externe droite retourne toutes les lignes du flux de données de droite et les enregistrements correspondants du flux de données de gauche. Si une ligne du flux de droite n’a pas de correspondance, les colonnes de sortie du flux de gauche ont pour valeur NULL. La sortie contient les lignes renvoyées par la jointure interne ainsi que les lignes sans correspondance du flux de droite.

Externe entière

La jointure externe complète génère toutes les colonnes et les lignes des deux côtés avec des valeurs NULL pour les colonnes sans correspondance.

Jointure croisée personnalisée

La jointure croisée génère le produit croisé des deux flux en fonction d’une condition. Si vous utilisez une condition qui n’est pas une égalité, spécifiez une expression personnalisée comme condition de jointure croisée. Le flux de sortie correspond à toutes les lignes qui répondent à la condition de jointure.

Vous pouvez utiliser ce type de jointure pour les jointures différentes et les conditions de OR.

Si vous souhaitez générer explicitement un produit cartésien complet, utilisez la transformation de colonne dérivée dans chacun des deux flux indépendants avant la jointure pour créer une clé synthétique à faire correspondre. Par exemple, créez une colonne dans la colonne dérivée de chaque flux nommé SyntheticKey et affectez-lui la valeur 1. Utilisez ensuite a.SyntheticKey == b.SyntheticKey comme expression de jointure personnalisée.

Notes

Veillez à inclure au moins une colonne de chaque côté de votre relation (gauche et droite) dans une jointure croisée personnalisée. L’exécution de jointures croisées avec des valeurs statiques plutôt que des colonnes de chaque côté entraîne des analyses complètes de l’ensemble du jeu de données, provoquant un fonctionnement médiocre du flux de données.

Jointure approximative

Vous pouvez choisir de joindre en fonction de la logique de jointure approximative au lieu de la correspondance exacte de la valeur de colonne en activant l’option de case à cocher « Utiliser la correspondance approximative ».

  • Combiner des parties de texte : utilisez cette option pour rechercher des correspondances en supprimant l’espace entre les mots. Par exemple, Data Factory est mis en correspondance avec DataFactory si cette option est activée.
  • Colonne de score de similarité : vous pouvez éventuellement choisir de stocker le score correspondant pour chaque ligne d’une colonne en entrant un nouveau nom de colonne ici pour stocker cette valeur.
  • Seuil de similarité : choisissez une valeur comprise entre 60 et 100 sous la forme d’une correspondance de pourcentage entre les valeurs dans les colonnes que vous avez sélectionnées.

Fuzzy join

Remarque

La correspondance approximative fonctionne actuellement uniquement avec les types de colonnes de chaîne et avec les types internes, externes gauches et de jointure externe entière. Vous devez désactiver l’optimisation de la diffusion lors de l’utilisation de jointures de correspondances approximatives.

Configuration

  1. Dans la liste déroulante Flux de droite, choisissez le flux de données que vous joignez.
  2. Sélectionner votre Type de jointure
  3. Choisissez les colonnes clés pour lesquelles vous souhaitez faire correspondre la condition de jointure. Par défaut, le flux de données recherche l’équivalence entre une colonne d’un flux et une colonne de l’autre flux. Pour effectuer une comparaison à l’aide d’une valeur calculée, pointez sur la liste déroulante de la colonne, puis sélectionnez Colonne calculée.

Screenshot of join Transformation

Jointures différentes

Pour utiliser un opérateur conditionnel tel que « différent de » (!=) ou « supérieur à » (>) dans vos conditions de jointure, modifiez la liste déroulante des opérateurs entre les deux colonnes. Des jointures différentes nécessitent qu’au moins l’un des deux flux soit diffusés en utilisant la diffusion fixe dans l’onglet Optimiser.

Non-equi join

Optimisation des performances de jointure

Contrairement à la jointure de fusion dans les outils tels que SSIS, la transformation de jointure n’est pas une opération de jointure de fusion obligatoire. Les clés de jointure ne nécessitent pas de tri. L’opération de jointure se produit en fonction de l’opération de jointure optimale dans Spark : soit la jointure de diffusion, soit la jointure côté mappage.

Join Transformation optimize

Dans les transformations de jointure, de recherche et d’existence, si l’un des flux de données ou les deux tiennent dans la mémoire de nœud Worker, vous pouvez optimiser les performances en activant la diffusion. Par défaut, le moteur Spark détermine automatiquement s’il faut diffuser un côté. Pour choisir manuellement le côté à diffuser, sélectionnez Fixe.

Il n’est pas recommandé de désactiver la diffusion à l’aide de l’option Désactivé à moins que vos jointures ne rencontrent des erreurs de délai d’attente.

Jointure réflexive

Pour joindre automatiquement un flux de données à lui-même, associez un alias à un flux existant à l’aide d’une transformation Select. Créez une branche en cliquant sur l’icône plus (+) en regard d’une transformation et en sélectionnant Nouvelle branche. Ajoutez une transformation SELECT pour créer un alias du flux d’origine. Ajoutez une transformation de jointure et choisissez le flux d’origine comme flux de gauche et la transformation SELECT comme flux de droite.

Self-join

Test des conditions de jointure

Lorsque vous testez les transformations de jointure avec l’aperçu des données en mode débogage, utilisez un jeu de données connues peu volumineux. Lors de l’échantillonnage de lignes à partir d’un jeu de données volumineux, vous ne pouvez pas prédire quelles lignes et quelles clés seront lues dans le cadre du test. Le résultat n’est pas déterministe, ce qui signifie que vos conditions de jointure peuvent ne renvoyer aucun résultat.

Script de flux de données

Syntaxe

<leftStream>, <rightStream>
    join(
        <conditionalExpression>,
        joinType: { 'inner'> | 'outer' | 'left_outer' | 'right_outer' | 'cross' }
        broadcast: { 'auto' | 'left' | 'right' | 'both' | 'off' }
    ) ~> <joinTransformationName>

Exemple de jointure interne

L’exemple ci-dessous illustre une transformation de jointure nommée JoinMatchedData, qui utilise le flux de gauche TripData et le flux de droite TripFare. La condition de jointure est l’expression hack_license == { hack_license} && TripData@medallion == TripFare@medallion && vendor_id == { vendor_id} && pickup_datetime == { pickup_datetime} qui retourne true si les colonnes hack_license, medallion, vendor_id et pickup_datetime de chaque flux correspondent. Le joinType est 'inner'. Nous activons la diffusion uniquement dans le flux de gauche afin que broadcast ait pour valeur 'left'.

Dans l’IU, cette transformation se présente comme dans l’image ci-dessous :

Screenshot shows the transformation with the Join Settings tab selected and a Join type of Inner.

Le script de flux de données pour cette transformation se trouve dans l’extrait de code ci-dessous :

TripData, TripFare
    join(
        hack_license == { hack_license}
        && TripData@medallion == TripFare@medallion
        && vendor_id == { vendor_id}
        && pickup_datetime == { pickup_datetime},
        joinType:'inner',
        broadcast: 'left'
    )~> JoinMatchedData

Exemple de jointure croisée personnalisée

L’exemple ci-dessous illustre une transformation de jointure nommée JoiningColumns, qui utilise le flux de gauche LeftStream et le flux de droite RightStream. Cette transformation prend deux flux et joint toutes les lignes où la colonne leftstreamcolumn est supérieure à la colonne rightstreamcolumn. Le joinType est cross. La diffusion n’est pas activée broadcast a la valeur 'none'.

Dans l’IU, cette transformation se présente comme dans l’image ci-dessous :

Screenshot shows the transformation with the Join Settings tab selected and a Join type of Custom (cross).

Le script de flux de données pour cette transformation se trouve dans l’extrait de code ci-dessous :

LeftStream, RightStream
    join(
        leftstreamcolumn > rightstreamcolumn,
        joinType:'cross',
        broadcast: 'none'
    )~> JoiningColumns

Après avoir joint les données, créez une colonne dérivée et réceptionnez vos données dans un magasin de données de destination.