首页 > 解决方案 > 聚集在 sparklyr

问题描述

我正在使用 sparklyr 来操作一些数据。给定一个,

a<-tibble(id = rep(c(1,10), each = 10),
          attribute1 = rep(c("This", "That", 'These', 'Those', "The", "Other", "Test", "End", "Start", 'Beginning'), 2),
          value = rep(seq(10,100, by = 10),2),
          average = rep(c(50,100),each = 10),
          upper_bound = rep(c(80, 130), each =10),
          lower_bound = rep(c(20, 70), each =10))

我想使用“收集”来操作数据,如下所示:

b<- a %>% 
     gather(key = type_data, value = value_data, -c(id:attribute1))

但是,“聚集”在 sparklyr 上不可用。我见过一些人使用 sdf_pivot 来模仿“收集”(例如如何在 sparklyr 中使用 sdf_pivot() 并连接字符串?),但我看不出在这种情况下如何使用它。

有人有想法吗?

干杯!

标签: rapache-sparkdplyrsparklyr

解决方案


这是gather在 sparklyr 中模仿的功能。这将收集给定的列,同时保持其他所有内容不变,但如果需要,它可以很容易地扩展。

# Function
sdf_gather <- function(tbl, gather_cols){

  other_cols <- colnames(tbl)[!colnames(tbl) %in% gather_cols]

  lapply(gather_cols, function(col_nm){
    tbl %>% 
      select(c(other_cols, col_nm)) %>% 
      mutate(key = col_nm) %>%
      rename(value = col_nm)  
  }) %>% 
    sdf_bind_rows() %>% 
    select(c(other_cols, 'key', 'value'))
}

# Example
spark_df %>% 
  select(col_1, col_2, col_3, col_4) %>% 
  sdf_gather(c('col_3', 'col_4'))

推荐阅读