SparkR库中是否有类似于melt的功能?

将1行50列的数据转换为50行3列的数据?

#1楼 票数:2

SparkR中没有提供类似功能的内置功能。 您可以用explode建立自己的

library(magrittr)

df <- createDataFrame(data.frame(
  A = c('a', 'b', 'c'),
  B = c(1, 3, 5),
  C = c(2, 4, 6)
))

melt <- function(df, id.vars, measure.vars, 
                 variable.name = "key", value.name = "value") {

   measure.vars.exploded <- purrr::map(
       measure.vars, function(c) list(lit(c), column(c))) %>% 
     purrr::flatten() %>% 
     (function(x) do.call(create_map, x)) %>% 
     explode()
   id.vars <- id.vars %>% purrr::map(column)

   do.call(select, c(df, id.vars, measure.vars.exploded)) %>%
     withColumnRenamed("key", variable.name) %>%
     withColumnRenamed("value", value.name)
}

melt(df, c("A"), c("B", "C")) %>% head()
  A key value                                                                   
1 a   B     1
2 a   C     2
3 b   B     3
4 b   C     4
5 c   B     5
6 c   C     6

或将SQL与Hive的stack UDF结合使用:

stack <- function(df, id.vars, measure.vars, 
                  variable.name = "key", value.name = "value") { 
  measure.vars.exploded <- glue::glue('"{measure.vars}", `{measure.vars}`') %>%  
    glue::glue_collapse(" , ") %>%
    (function(x) glue::glue(
      "stack({length(measure.vars)}, {x}) as ({variable.name}, {value.name})"
    )) %>%
    as.character()
    do.call(selectExpr, c(df, id.vars, measure.vars.exploded))
}

stack(df, c("A"), c("B", "C")) %>% head()
  A key value
1 a   B     1
2 a   C     2
3 b   B     3
4 b   C     4
5 c   B     5
6 c   C     6

相关问题:

  ask by user124543131234523 translate from so

未解决问题?本站智能推荐:

1回复

相当于sparkR中的Rmapvalues函数

我正在寻找与mapvalues中 R 中的mapvalues函数等效的函数,例如 我在 Scala 中找到了与此等效的函数,例如this 。 但是我在 sparkR 的文档中找不到它。 编辑: 在链接的 doumentation 中有一个名为map_values的函数: 但它的使用方式不同, map
1回复

SparkR-强制转换为日期格式

如何将Spark数据框的字符串转换为具有特定格式的日期? 在dplyr中,我会这样做:
2回复

sparkR-列表中的子集值

如何为Spark数据框执行以下任务。 在dplyr中,我会这样做: 如何为sparkR数据帧执行filter(x%in%df2 $ r)命令?
3回复

Rstudio的SparkR-在invokeJava(isStatic=TRUE,className,methodName,…)中给出错误:

我正在使用RStudio。 创建会话后,如果我尝试使用R数据创建数据帧,则会出错。 错误: TIA。
1回复

SparkR窗口功能

我从JIRA中发现, SparkR 1.6发行版已实现了包括lag和rank窗口函数,但尚未实现over函数。 如何在SparkR使用像lag函数这样的窗口函数而不会over (不是SparkSQL方式)? 有人可以提供例子吗?
1回复

使用从SparkR到R的保存矢量

我从sparkR中保存了一个长向量。 我想保存它并在R中使用此向量。向量为u = c(1,2,3,5,6,9,...),我想将此向量用作数据集中的条目:data [ u,]如何做到这一点?
1回复

我如何并行(最好是通过sparkR)实现“by”功能

我需要在非常大的数据集上应用“ by”功能。 数据如下: 我需要为每个id计算value1和value2之间的值,以便: 但是,数据非常大。 这种计算需要很多时间。 我想知道,是否仍有加速此功能的方法。 我想使用并行方法,最好使用sparkR。 但是我不知道该怎么做。 S
1回复

sparkR安装是否取决于R安装?

对于SparkR的最新版本(1.6和2.0),我需要安装R吗? 如果我需要R来运行sparkR,是否需要在具有CDH和spark的Yarn群集中的所有数据节点上安装R?