Apache Spark n'inclut pas de lignes avec des valeurs nulles par défaut lors des jointures. Cela peut entraîner des problèmes lorsque vous souhaitez conserver toutes les données, y compris les valeurs NULL. Cet article explore la solution à ce problème.
Lorsque vous effectuez une jointure sur deux DataFrames, Spark exclura les lignes avec des valeurs nulles. Par exemple, considérons les DataFrames suivants :
val numbersDf = Seq( ("123"), ("456"), (null), ("") ).toDF("numbers") val lettersDf = Seq( ("123", "abc"), ("456", "def"), (null, "zzz"), ("", "hhh") ).toDF("numbers", "letters")
Si nous effectuons une jointure sur ces DataFrames, nous obtiendrons le résultat suivant :
+-------+-------+ |numbers|letters| +-------+-------+ | 123| abc| | 456| def| | | hhh| +-------+-------+
Comme vous pouvez le voir, la ligne avec null dans la colonne des nombres a été exclu du résultat.
Spark fournit un opérateur d'égalité spécial de sécurité nulle pour gérer les jointures avec des valeurs nulles :
numbersDf .join(lettersDf, numbersDf("numbers") <=> lettersDf("numbers")) .drop(lettersDf("numbers"))
Cet opérateur retournera vrai si les deux opérandes sont nuls ou s'ils sont égaux. En utilisant cet opérateur, nous pouvons obtenir le résultat souhaité :
+-------+-------+ |numbers|letters| +-------+-------+ | 123| abc| | 456| def| | null| zzz| | | hhh| +-------+-------+
Spark 2.3.0 :
Étincelle antérieure Versions :
Avant Spark 1.6, les jointures Null-Safe nécessitaient un produit cartésien.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!