如果我有一个名为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并没有帮助。
答案 0 :(得分:4)
因为null表示没有价值,不应该像这样检查。
使用isNull
功能:
val df3 = df2.withColumn("a1", when($"a1".isNull, $"a2"))
或coalesce
,返回第一个非空值:
val df3 = df2.withColumn("a1", coalesce($"a1", $"a2"))