Spark

Jointure null-safe avec eqNullSafe

L'égalité standard élimine les NULL des deux côtés (NULL == NULL est NULL) ; eqNullSafe les apparie, indispensable sur des clés composites nullable.

Cas d'usage

Comparer deux versions d'une table dont certaines colonnes clés sont nullable.

Prérequis

PySpark 3.x

Python
from pyspark.sql import functions as F

# Jointure standard : les lignes où region est NULL ne matchent JAMAIS
joined_lossy = old.join(new, old["region"] == new["region"])

# Null-safe : NULL <=> NULL est vrai
joined_safe = old.alias("o").join(
    new.alias("n"),
    F.col("o.region").eqNullSafe(F.col("n.region"))
    & F.col("o.segment").eqNullSafe(F.col("n.segment")),
    "full_outer",
)
# Équivalent SQL : ON o.region <=> n.region

Résultat

>>> joined_safe.select("o.region", "o.segment", "n.amount").show()
+------+-------+------+
|region|segment|amount|
+------+-------+------+
|  EMEA|    SMB|482.50|
|  null|    ENT|310.00|
|  null|   null| 75.25|
+------+-------+------+

Jointure standard : 1 ligne ; eqNullSafe : 3 lignes (les NULL matchent)
PySparkNULLeqNullSafeJoin

Snippets liés

Retour au Data Lab