在DataFrame.withColumn中,如何检查列的值是否为空,作为第二个参数的条件?

时间:2017-05-08 17:39:14

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

如果我有一个名为df的DataFrame,它看起来像:

+----+----+
|  a1+  a2|
+----+----+
| foo| bar|
| N/A| baz|
|null| etc|
+----+----+

我可以选择性地替换这样的值:

val df2 = df.withColumn("a1", when($"a1" === "N/A", $"a2"))

所以df2看起来像:

+----+----+
|  a1+  a2|
+----+----+
| foo| bar|
| baz| baz|
|null| etc|
+----+----+

但为什么我无法检查它是否为空,如:

val df3 = df2.withColumn("a1", when($"a1" === null, $"a2"))

所以我得到:

+----+----+
|  a1+  a2|
+----+----+
| foo| bar|
| baz| baz|
| etc| etc|
+----+----+

编辑:$" a1" .isNull似乎无法正常工作。可能是因为我如何构建我用来测试的数据帧,如下所示?

val schema = StructType(
                StructField("a1", StringType, false) ::
                StructField("a2", StringType, false) :: Nil
)

val data = sc.parallelize(Array(
                Row("foo","bar"),
                Row("N/A","baz"),
                Row(null,"etc"))
)

val df = sqlContext.createDataFrame(data, schema)

据我所知,我也不能使用合并,因为有时我需要使用静态值而不是其他列的值。

再次编辑:将我的测试列设置为nullable = false并没有帮助。

1 个答案:

答案 0 :(得分:4)

因为null表示没有价值,不应该像这样检查。

使用isNull功能:

val df3 = df2.withColumn("a1", when($"a1".isNull, $"a2"))

coalesce,返回第一个非空值:

val df3 = df2.withColumn("a1", coalesce($"a1", $"a2"))