Utiliser des jointures sur Azure Databricks
Databricks prend en charge la syntaxe de jointure standard ANSI. Cet article décrit les différences entre les jointures avec traitement par lots et traitement par flux, et fournit des recommandations pour optimiser les performances des jointures.
Remarque
Databricks prend également en charge la syntaxe standard pour les opérateurs ensemblistes UNION
, INTERSECT
et EXCEPT
. Consultez Opérateurs ensemblistes.
Différences entre les jointures par flux et les jointures par lots
Les jointures sur Azure Databricks sont avec état ou sans état.
Toutes les jointures par lots sont des jointures sans état. Les résultats traitent immédiatement et reflètent les données au moment de l’exécution de la requête. Chaque fois que la requête s’exécute, de nouveaux résultats sont calculés en fonction des données sources spécifiées. Consultez Jointures par lots.
Les jointures entre deux sources de données par flux sont avec état. Dans les jointures avec état, Azure Databricks effectue le suivi des informations sur les sources de données et les résultats, et met à jour les résultats de façon itérative. Les jointures avec état peuvent fournir des solutions puissantes pour le traitement des données en ligne, mais elles peuvent être difficiles à implémenter efficacement. Elles ont une sémantique opérationnelle complexe en fonction du mode de sortie, de l’intervalle du déclencheur et du filigrane. Consultez Jointures flux-flux.
Les jointures statiques de flux sont sans état, mais sont un bon choix pour faire la jointure d’une source de données incrémentielle (comme une table de faits) avec une source de données statique (comme une table dimensionnelle à variation lente). Au lieu de faire la jointure de tous les enregistrements des deux côtés chaque fois qu’une requête s’exécute, seuls les enregistrements nouvellement reçus de la source de flux sont joints à la version actuelle de la table statique. Consultez Jointures statiques de flux.
Jointures par lots
Azure Databricks prend en charge la syntaxe de jointure SQL standard, y compris les jointures internes, les jointures externes, les semi-jointures, les anti-jointures et les jointures croisées. Consultez JOIN.
Remarque
Databricks recommande d’utiliser une vue matérialisée pour optimiser le calcul incrémentiel des résultats d’une jointure interne. Consultez Utiliser des vues matérialisées dans Databricks SQL.
Jointures flux-flux
La jonction de deux sources de données de flux peut présenter des problématiques importantes dans la gestion des informations d’état et de raisonnement sur le calcul et la sortie des résultats. Avant d’implémenter une jointure flux- flux, Databricks vous recommande de bien comprendre la sémantique opérationnelle pour les flux avec état, notamment la façon dont les filigranes affectent la gestion de l’état. Voir les articles suivants :
- Qu’est-ce que la diffusion en continu avec état ?
- Appliquer des filigranes pour contrôler les seuils de traitement des données
- Jointures flux-flux
Databricks recommande de spécifier des filigranes pour les deux côtés de toutes les jointures flux-flux. Les types de jointure suivants sont pris en charge :
- Jointures internes
- Jointures externes gauches
- Jointures externes droites
- Jointures externes entières
- Semi-jointures gauches
Consultez la documentation d’Apache Spark Structured Streaming sur les jointures flux-flux.
Jointures statiques de flux
Remarque
Le comportement décrit pour les jointures statiques de flux suppose que les données statiques sont stockées en utilisant Delta Lake.
Une jointure stream-static joint la dernière version valide d’une table Delta (les données statiques) à un flux de données à l’aide d’une jointure sans état.
Quand Azure Databricks traite un micro-lot de données dans une jointure stream-static, la dernière version valide des données de la table Delta statique est jointe aux enregistrements présents dans le micro-lot actuel. La jointure étant sans état, vous n’avez pas besoin de configurer le filigrane et pouvez traiter les résultats avec une faible latence. Les données de la table Delta statique utilisée dans la jointure doivent changer lentement.
L’exemple suivant illustre ce modèle :
streamingDF = spark.readStream.table("orders")
staticDF = spark.read.table("customers")
query = (streamingDF
.join(staticDF, streamingDF.customer_id==staticDF.id, "inner")
.writeStream
.option("checkpointLocation", checkpoint_path)
.table("orders_with_customer_info")
)
Optimiser les performances de jointure
Le calcul avec Photon activé sélectionne toujours le meilleur type de jointure. Consultez Qu’est-ce que Photon ?.
L’utilisation d’une version récente de Databricks Runtime avec Photon activé offre généralement de bonnes performances de jointure, mais vous devez également prendre en compte les recommandations suivantes :
Les jointures croisées sont très coûteuses. Supprimez les jointures croisées des charges de travail et des requêtes qui nécessitent une faible latence ou un recalcul fréquent.
L’ordre des jointures est important. Quand vous effectuez plusieurs jointures, faites d’abord les jointures de vos tables les plus petites, puis joignez le résultat avec les tables plus grandes.
L’optimiseur peut avoir des difficultés avec les requêtes comportant de nombreuses jointures et agrégations. Le fait d’enregistrer des résultats intermédiaires peut accélérer la planification des requêtes et les résultats des calculs.
Procédez à l’actualisation des statistiques pour améliorer les performances. L’optimisation prédictive avec
ANALYZE
(préversion publique) peut mettre à jour et gérer automatiquement les statistiques. Vous pouvez également exécuter la requêteANALYZE TABLE table_name COMPUTE STATISTICS
pour mettre à jour les statistiques dans le planificateur de requêtes.
Important
L’optimisation prédictive avec ANALYZE
est en préversion publique. Il inclut la collecte intelligente des statistiques pendant les écritures. Utilisez ce formulaire pour vous inscrire à la préversion publique.
Remarque
Dans Databricks Runtime 14.3 LTS et ultérieur, vous pouvez modifier les colonnes sur lesquelles Delta Lake collecte des statistiques pour les données ignorées, puis recalculer les statistiques existantes dans le journal Delta. Consultez Spécifier des colonnes de statistiques Delta.
Indicateurs de jointure sur Azure Databricks
Apache Spark prend en charge la spécification d’indicateurs de jointure pour les jointures de plages et les jointures asymétriques. Les indicateurs pour les jointures asymétriques ne sont pas nécessaires, car Azure Databricks optimise automatiquement ces jointures. Consultez Indicateurs.
Les indicateurs pour les jointures de plages peuvent être utiles si les performances des jointures sont médiocres et que vous effectuez des jointures d’inégalité. Les exemples incluent des jointures sur des plages d’horodatages ou sur une plage d’ID de clustering. Voir Optimisation des jointures de plage.