2016-10-19 109 views
0

我正在尋找一種在DataFrame中具有空數據的字段上使用過濾器的方法。 下面是我有兩個字段的示例DataFrame:id和value。 值字段中有一個空值。過濾Spark數據框中數據爲空值的字符串數據

val testData = Array((1,"actualstring1"),(2,null),(3,"actualstring2"),(4,"testString1")) 
val testDataDF = sc.parallelize(testData).toDF("id", "value") 

我用下面的代碼片段來篩選測試字符串,假設輸出有三條記錄。令我驚訝,我只拿到了以下兩個記錄:

testDataDF.filter(!col("value").contains("test")).show 

這給下面的結果:

+---+-------------+ 
| id|  value| 
+---+-------------+ 
| 1|actualstring1| 
| 3|actualstring2| 
+---+-------------+ 

在這裏我們看到,隨着id=2記錄在這個過程filteration被忽略。 我現在堅持如何將id=2以及我們正在獲得的兩行一起包括在輸出中。

感謝所有幫助

回答

1

您有一個默認爲FALSE取代目前的狀況:

not(coalesce(col("value").contains("test"), lit(false)) 

其中

lit(false) 

是一個布爾值,並

coalesce(_, _) 

返回從左數起的第一個NOT NULL元素,或者如果此元素不存在,則返回NULL

1

您可以測試在過濾器col("value") != null

testDataDF.filter(col("value") != null && !col("value").contains("test")).show