我有以下数据框:
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|
我无法理解为什么价值1
,null
会被展示以及如何克服这一点。任何人都可以帮助我吗?
答案 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
函数应该始终是唯一没有内置函数的选项,因为它需要对列数据进行序列化和反序列化。