如果null替换为0,否则默认值在同一列中

时间:2016-01-07 11:46:01

标签: r apache-spark sparkr

在SparkR shell 1.5.0中,创建了一个示例数据集:

df_test <- createDataFrame(sqlContext, data.frame(mon = c(1,2,3,4,5), year = c(2011,2012,2013,2014,2015)))
df_test1 <- createDataFrame(sqlContext, data.frame(mon1 = c(1,2,3,4,5,6,7,8)))
df_test2 <- join(df_test1, df_test, joinExpr = df_test1$mon1 == df_test$mon, joinType = "left_outer")

数据集:df_test2

+----+----+------+
|mon1| mon|  year|
+----+----+------+
| 7.0|null|  null|
| 1.0| 1.0|2011.0|
| 6.0|null|  null|
| 3.0| 3.0|2013.0|
| 5.0| 5.0|2015.0|
| 8.0|null|  null|
| 4.0| 4.0|2014.0|
| 2.0| 2.0|2012.0|
+----+----+------+

问题:如果有null如何将其替换为0列中的df_test2$year,或者使用默认值?

输出应该如下所示,

+----+----+------+
|mon1| mon|  year|
+----+----+------+
| 7.0|null|  0   |
| 1.0| 1.0|2011.0|
| 6.0|null|  0   |
| 3.0| 3.0|2013.0|
| 5.0| 5.0|2015.0|
| 8.0|null|  0   |
| 4.0| 4.0|2014.0|
| 2.0| 2.0|2012.0|
+----+----+------+

我使用了otherwise/when,但没有工作

df_test2$year <- otherwise(when(isNull(df_test2$year), 0 ), df_test2$year)

抛出错误,

Error in rep(yes, length.out = length(ans)) :
  attempt to replicate an object of type 'environment'

2 个答案:

答案 0 :(得分:3)

我使用原始SQL case when表达式来获得答案,

df_test3 <- sql(sqlContext, "select mon1, mon, case when year is null then 0 else year end year FROM temp")

showDF(df_test3)
+----+----+------+
|mon1| mon|  year|
+----+----+------+
| 7.0|null|   0.0|
| 1.0| 1.0|2011.0|
| 6.0|null|   0.0|
| 3.0| 3.0|2013.0|
| 5.0| 5.0|2015.0|
| 8.0|null|   0.0|
| 4.0| 4.0|2014.0|
| 2.0| 2.0|2012.0|
+----+----+------+

即使它给出了答案,我也在寻找纯粹的sparkR代码。

答案 1 :(得分:2)

df_test2$year <- ifelse(isNull(df_test2$year), 0, df_test2$year)

解决问题的纯SparkR代码。