查找并替换不工作 - dataframe spark scala

时间:2017-07-18 14:21:46

标签: scala apache-spark spark-dataframe

我有以下数据框:

df.show

+----------+-----+
| createdon|count|
+----------+-----+
|2017-06-28|    1|
|2017-06-17|    2|
|2017-05-20|    1|
|2017-06-23|    2|
|2017-06-16|    3|
|2017-06-30|    1|

我想将计数值替换为0,它大于1,即结果数据框应为:

+----------+-----+
| createdon|count|
+----------+-----+
|2017-06-28|    1|
|2017-06-17|    0|
|2017-05-20|    1|
|2017-06-23|    0|
|2017-06-16|    0|
|2017-06-30|    1|

我尝试了以下表达式:

df.withColumn("count", when(($"count" > 1), 0)).show

但输出是

+----------+--------+
| createdon|   count|
+----------+--------+
|2017-06-28|    null|
|2017-06-17|       0|
|2017-05-20|    null|
|2017-06-23|       0|
|2017-06-16|       0|
|2017-06-30|    null|

我无法理解为什么价值1null会被展示以及如何克服这一点。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

您需要在otherwise之后链接when以指定条件不会保留的值;在您的情况下,它将是count列本身:

df.withColumn("count", when(($"count" > 1), 0).otherwise($"count"))

答案 1 :(得分:0)

这也可以使用udf功能

来完成
def replaceWithZero = udf((col: Int) => if(col > 1) 0 else col) //udf function

df.withColumn("count", replaceWithZero($"count")).show(false) //calling udf function

注意: udf函数应该始终是唯一没有内置函数的选项,因为它需要对列数据进行序列化和反序列化。