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不会有帮助。
因为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)
| 归档时间: |
|
| 查看次数: |
3450 次 |
| 最近记录: |