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

yoe*_*oel 0 scala dataframe apache-spark apache-spark-sql spark-dataframe

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

+----+----+
|  a1+  a2|
+----+----+
| foo| bar|
| N/A| baz|
|null| etc|
+----+----+
Run Code Online (Sandbox Code Playgroud)

我可以像这样有选择地替换值:

val df2 = df.withColumn("a1", when($"a1" === "N/A", $"a2"))
Run Code Online (Sandbox Code Playgroud)

所以df2看起来像:

+----+----+
|  a1+  a2|
+----+----+
| foo| bar|
| baz| baz|
|null| etc|
+----+----+
Run Code Online (Sandbox Code Playgroud)

但是为什么我不能检查它是否为null,例如:

val df3 = df2.withColumn("a1", when($"a1" === null, $"a2"))
Run Code Online (Sandbox Code Playgroud)

这样我得到:

+----+----+
|  a1+  a2|
+----+----+
| foo| bar|
| baz| baz|
| etc| etc|
+----+----+
Run Code Online (Sandbox Code Playgroud)

编辑:$“ 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)
Run Code Online (Sandbox Code Playgroud)

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

再次编辑:将测试列设置为nullable = false不会有帮助。

T. *_*ęda 5

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

使用isNull功能:

val df3 = df2.withColumn("a1", when($"a1".isNull, $"a2"))
Run Code Online (Sandbox Code Playgroud)

coalesce,它返回第一个非空值:

val df3 = df2.withColumn("a1", coalesce($"a1", $"a2"))
Run Code Online (Sandbox Code Playgroud)