Aller au contenu principal

Travailler avec les jointures sur Databricks

Databricks prend en charge la syntaxe de jointure standard ANSI. Cette page décrit les différences entre les jointures avec le traitement par batch et par stream.

remarque

Databricks prend également en charge la syntaxe standard pour les opérateurs d'ensemble UNION, INTERSECT et EXCEPT. Voir Opérateurs d'ensemble.

Différences entre les jointures en streaming et en batch

Les jointures sur Databricks sont soit avec état, soit sans état.

Toutes les jointures par batch sont des jointures sans état. Les résultats sont traités immédiatement et reflètent les données au moment où la query s'exécute. Chaque fois que la query s’exécute, de nouveaux résultats sont calculés en fonction des données source spécifiées. Voir les jointures par batch.

Les jointures entre deux sources de données streaming sont avec état. Dans les jointures avec état, Databricks suit les informations concernant les sources de données et les résultats, et met à jour les résultats de manière itérative. Les jointures avec état peuvent fournir des Solutions puissantes pour le traitement des données en ligne, mais elles peuvent être difficiles à mettre en œuvre efficacement. Elles ont une sémantique opérationnelle complexe en fonction du mode de sortie, du Trigger d'intervalle et du filigrane. Voir Jointures Stream-Stream.

Les jointures Stream-statiques sont sans état, mais offrent une bonne option pour joindre une source de données incrémentielle (telle qu'une table de faits) avec une source de données statique (telle qu'une table dimensionnelle à évolution lente). Plutôt que de joindre tous les enregistrements des deux côtés à chaque exécution d'une query, seuls les nouveaux enregistrements reçus de la source de streaming sont joints à la version actuelle de la table statique. Voir Jointures de Stream-statiques.

Jointures batch

Databricks prend en charge la syntaxe de jointure SQL standard, y compris les jointures internes, externes, semi-jointures, anti-jointures et croisements. 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 les vues matérialisées.

Jointures stream-stream

La jonction de deux sources de données de streaming peut présenter des défis importants dans la gestion des informations d'état et le raisonnement concernant le calcul et la sortie des résultats. Avant d'implémenter une jointure stream-stream, Databricks recommande de développer une compréhension approfondie de la sémantique opérationnelle du streaming avec état, y compris de la manière dont les filigranes impactent la gestion de l'état. Consultez les pages suivantes :

Databricks recommande de spécifier des filigranes pour les deux côtés de toutes les jointures stream-stream. Les types de jointure suivants sont pris en charge :

  • Jointures internes
  • Jointures externes gauches
  • Jointures externes droites
  • Jointures externes complètes
  • Jointures semi-gauches

Consultez la documentation Apache Spark Structured Streaming sur les jointures de Stream à Stream.

Jointures Stream-statiques

remarque

Le comportement décrit pour les jointures stream-statiques suppose que les données statiques sont stockées à l'aide de Delta Lake.

Une jointure de Stream-statique joint la dernière version valide d’une table Delta (les données statiques) à un Stream de données à l’aide d’une jointure sans état.

Lorsque Databricks traite un micro-batch de données dans une jointure de flux statique, la dernière version valide des données de la table Delta statique est jointe aux enregistrements présents dans le micro-batch actuel. Comme la jointure est 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 devraient évoluer lentement.

remarque

Si vous mettez à jour la table statique entre les exécutions, le nouveau traitement des mêmes données de streaming peut produire des résultats différents. La sortie d'une jointure statique-Stream n'est pas déterministe si le côté statique de la jointure change, car chaque micro-lot se joint à la dernière version de la table statique au moment du traitement

L’exemple suivant démontre ce modèle :

Python
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")
)

Conseils de jointure sur 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 jonctions asymétriques ne sont pas nécessaires car Databricks optimise automatiquement ces jonctions. Voir Conseils.

Les conseils pour les jointures par plage peuvent être utiles si les performances des jointures sont médiocres et si vous effectuez des jointures d'inégalité. Par exemple, l'utilisation de jointures sur des plages de Timestamp ou une plage d'ID de clustering. Consultez Optimisation des jointures par plage et Optimiser les performances des jointures dans Databricks.