2016-10-19 75 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