过滤Spark数据帧中的字符串数据,其中数据具有空值

时间:2016-10-19 09:41:44

标签: apache-spark dataframe apache-spark-sql

我正在寻找一种在DataFrame中具有空数据的字段上使用过滤器的方法。 下面是我的示例DataFrame,其中包含两个字段:id和value。 value字段中包含空值。

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的记录。 我现在不知道如何在输出中包含id=2的行以及我们得到的两行。

感谢任何帮助

2 个答案:

答案 0 :(得分:1)

您将当前条件替换为默认为FALSE

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

,其中

lit(false)

是一个布尔文字,

coalesce(_, _)

返回从左侧开始计算的第一个NOT NULL元素,如果此元素不存在,则返回NULL

答案 1 :(得分:1)

您可以在过滤器中测试col("value") != null

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