首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sparklyr pivot数据帧

sparklyr pivot数据帧
EN

Stack Overflow用户
提问于 2017-01-25 21:43:24
回答 1查看 692关注 0票数 2

目前sparklyr (0.5.1)还没有针对Spark的pivot实现。

所以,我想知道如何使用invoke函数来实现这一点。

到目前为止,我已经到了这里。

代码语言:javascript
复制
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? 

并纠结于如何编写聚合表达式?

EN

回答 1

Stack Overflow用户

发布于 2017-06-26 00:49:14

这将带你走完一半的路:

代码语言:javascript
复制
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)

助手函数:

代码语言:javascript
复制
#' Given name, return corresponding SQL function
sqlf <- function(f) function(x, ...) {
  invoke_static(sc, "org.apache.spark.sql.functions", f, x, ...)
}

熔化函数:

代码语言:javascript
复制
#' @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)
}

示例用法:

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41853198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档