Apache Spark 在联接过程中默认不包含具有空值的行。当您想要保留所有数据(包括空值)时,这可能会导致问题。本文探讨了此问题的解决方案。
当您对两个 DataFrame 执行联接时,Spark 将排除具有 null 值的行。例如,考虑以下 DataFrame:
val numbersDf = Seq( ("123"), ("456"), (null), ("") ).toDF("numbers") val lettersDf = Seq( ("123", "abc"), ("456", "def"), (null, "zzz"), ("", "hhh") ).toDF("numbers", "letters")
如果我们对这些 DataFrame 执行联接,我们将得到以下输出:
+-------+-------+ |numbers|letters| +-------+-------+ | 123| abc| | 456| def| | | hhh| +-------+-------+
如您所见,带有数字列中的 null 已从结果中排除。
Spark 提供了一个特殊的用于处理空值连接的空安全相等运算符:
numbersDf .join(lettersDf, numbersDf("numbers") <=> lettersDf("numbers")) .drop(lettersDf("numbers"))
如果两个操作数都为空或相等,则此运算符将返回 true。使用此运算符,我们可以获得所需的输出:
+-------+-------+ |numbers|letters| +-------+-------+ | 123| abc| | 456| def| | null| zzz| | | hhh| +-------+-------+
Spark 2.3.0 :
早期 Spark版本:
在 Spark 1.6 之前,空安全连接需要笛卡尔积。
以上是如何在 Apache Spark 连接期间处理空值?的详细内容。更多信息请关注PHP中文网其他相关文章!