Partager via


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 le traitement en lot et le traitement en flux.

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. Voir 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 Vues matérialisées.

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 :

Databricks recommande de spécifier des filigranes pour chaque côté de toutes les jointures de 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 Apache Spark Structured Streaming sur les jointures de 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")
)

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. Consultez Optimisation des jointures par plage et Optimiser des performances des jointures dans Azure Databricks.