2017-01-25 12 views
2

現在sparklyr (0.5.1)には、pivotのSpark実装がありません。sparklyr pivotデータフレーム

したがって、invoke機能を使用してこれを実装するにはどうすればよいでしょうか。

これまでのところ私はここにいた。

iris_tbl <- copy_to(sc, iris) 
spark_dataframe(iris_tbl) %>% 
    invoke("groupBy", "Species", list()) %>% 
    invoke("pivot", "Sepal.Width", list()) %>% 
    invoke( ...) # <- how to create aggregate expression? 

集計式はどのように記述しますか?

+0

似たようなものを探していただけではわかりませんでした。 Javaの終わりでタイプの不一致があると思われます。つまり、渡される型の 'agg'メソッドはありません(' list() 'によっておそらく設定されています)? 'list()'引数は何ですか? –

答えて

1

これは、あなたが半分になります:

library(stringi) 

sc <- spark_connect("local[*]") 
df <- data.frame(A = c("a", "b", "c"), B = c(1, 3, 5), C = c(2, 4, 6)) 
sdf <- copy_to(sc, df, overwrite =TRUE) 

ヘルパー機能:

#' Given name, return corresponding SQL function 
sqlf <- function(f) function(x, ...) { 
    invoke_static(sc, "org.apache.spark.sql.functions", f, x, ...) 
} 

メルト機能:

#' @param df tbl_spark 
#' @param sc spark_connection 
#' @param id_vars id columns 
#' 
melt <- function(df, sc, id_vars, value_vars = NULL, 
    var_name = "key", value_name = "value") { 
    # Alias for the output view 
    alias <- paste(deparse(substitute(df)), stri_rand_strings(1, 10), sep = "_") 
    # Get session and JVM object 
    spark <- spark_session(sc) 
    jdf <- spark_dataframe(df) 

    # Convert characters to JVM Columns 
    j_id_vars <- lapply(id_vars, sqlf("col")) 

    # Combine columns into array<struct<key,value>> and explode 
    exploded <- sqlf("explode")(sqlf("array")(lapply(value_vars, function(x) { 
    key <- sqlf("lit")(x) %>% invoke("alias", var_name) 
    value <- sqlf("col")(x) %>% invoke("alias", value_name) 
    sqlf("struct")(list(key, value)) 
    }))) 

    # expand struct<..., struct<key, value>> into struct<..., key, value> 
    exprs <- lapply(
    c(id_vars, paste("col", c(var_name, value_name), sep = ".")), 
    sqlf("col")) 

    # Explode and register as temp table 
    jdf %>% 
    invoke("withColumn", "col", exploded) %>% 
    invoke("select", exprs) %>% 
    invoke("createOrReplaceTempView", alias) 

    dplyr::tbl(sc, alias) 
} 

使用例:

melt(sdf, sc, "A", c("B", "C")) 

## Source: query [6 x 3] 
## Database: spark connection master=local[*] app=sparklyr local=TRUE 
## 
## # A tibble: 6 x 3 
##  A key value 
## <chr> <chr> <dbl> 
## 1  a  B  1 
## 2  a  C  2 
## 3  b  B  3 
## 4  b  C  4 
## 5  c  B  5 
## 6  c  C  6