Skip to content
Snippets Groups Projects
Commit bf32c1f7 authored by Yu ISHIKAWA's avatar Yu ISHIKAWA Committed by Shivaram Venkataraman
Browse files

[SPARK-10075] [SPARKR] Add `when` expressino function in SparkR

- Add `when` and `otherwise` as `Column` methods
- Add `When` as an expression function
- Add `%otherwise%` infix as an alias of `otherwise`

Since R doesn't support a feature like method chaining, `otherwise(when(condition, value), value)` style is a little annoying for me. If `%otherwise%` looks strange for shivaram, I can remove it. What do you think?

### JIRA
[[SPARK-10075] Add `when` expressino function in SparkR - ASF JIRA](https://issues.apache.org/jira/browse/SPARK-10075)

Author: Yu ISHIKAWA <yuu.ishikawa@gmail.com>

Closes #8266 from yu-iskw/SPARK-10075.
parent a5b5b936
No related branches found
No related tags found
No related merge requests found
......@@ -152,6 +152,7 @@ exportMethods("abs",
"n_distinct",
"nanvl",
"negate",
"otherwise",
"pmod",
"quarter",
"reverse",
......@@ -182,6 +183,7 @@ exportMethods("abs",
"unhex",
"upper",
"weekofyear",
"when",
"year")
exportClasses("GroupedData")
......
......@@ -203,3 +203,17 @@ setMethod("%in%",
jc <- callJMethod(x@jc, "in", table)
return(column(jc))
})
#' otherwise
#'
#' If values in the specified column are null, returns the value.
#' Can be used in conjunction with `when` to specify a default value for expressions.
#'
#' @rdname column
setMethod("otherwise",
signature(x = "Column", value = "ANY"),
function(x, value) {
value <- ifelse(class(value) == "Column", value@jc, value)
jc <- callJMethod(x@jc, "otherwise", value)
column(jc)
})
......@@ -165,3 +165,17 @@ setMethod("n", signature(x = "Column"),
function(x) {
count(x)
})
#' when
#'
#' Evaluates a list of conditions and returns one of multiple possible result expressions.
#' For unmatched expressions null is returned.
#'
#' @rdname column
setMethod("when", signature(condition = "Column", value = "ANY"),
function(condition, value) {
condition <- condition@jc
value <- ifelse(class(value) == "Column", value@jc, value)
jc <- callJStatic("org.apache.spark.sql.functions", "when", condition, value)
column(jc)
})
......@@ -651,6 +651,14 @@ setGeneric("rlike", function(x, ...) { standardGeneric("rlike") })
#' @export
setGeneric("startsWith", function(x, ...) { standardGeneric("startsWith") })
#' @rdname column
#' @export
setGeneric("when", function(condition, value) { standardGeneric("when") })
#' @rdname column
#' @export
setGeneric("otherwise", function(x, value) { standardGeneric("otherwise") })
###################### Expression Function Methods ##########################
......
......@@ -727,6 +727,13 @@ test_that("greatest() and least() on a DataFrame", {
expect_equal(collect(select(df, least(df$a, df$b)))[, 1], c(1, 3))
})
test_that("when() and otherwise() on a DataFrame", {
l <- list(list(a = 1, b = 2), list(a = 3, b = 4))
df <- createDataFrame(sqlContext, l)
expect_equal(collect(select(df, when(df$a > 1 & df$b > 2, 1)))[, 1], c(NA, 1))
expect_equal(collect(select(df, otherwise(when(df$a > 1, 1), 0)))[, 1], c(0, 1))
})
test_that("group by", {
df <- jsonFile(sqlContext, jsonPath)
df1 <- agg(df, name = "max", age = "sum")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment