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 :
SQL: 使用與
不同早期Spark版本:在 Spark 1.6 之前,空安全連線需要笛卡爾積。
以上是如何在 Apache Spark 連線期間處理空值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!