Как использовать sdf_pivot() в sparklyr и объединять строки?

Я пытаюсь использовать функцию sdf_pivot() в sparklyr, чтобы «собрать» кадр данных длинного формата в широкий формат. Значения переменных представляют собой строки, которые я хотел бы объединить.

Вот простой пример, который, я думаю, должен работать, но не работает:

library(sparkylr)
d <- data.frame(id=c("1", "1", "2", "2", "1", "2"), 
                 x=c("200", "200", "200", "201", "201", "201"), 
                 y=c("This", "That", "The", "Other", "End", "End"))
d_sdf <- copy_to(sc, d, "d")
sdf_pivot(d_sdf, id ~ x, paste)

Я бы хотел, чтобы он произвел:

| id | `200`       | `201`           |
|====|=============|=================|
| 1  | "This That" | "End"           |
| 2  | "The"       | "Other End"     |

К сожалению, это дает мне сообщение об ошибке:

Error in as.vector(x, "character") : 
  cannot coerce type 'environment' to vector of type 'character'

Я также пытался использовать "collect_list", и это дает мне эту ошибку:

Error: java.lang.IllegalArgumentException: invalid method collect_list 
 for object 641

Есть ли способ сделать то, что я пытаюсь сделать?


person Dave Kincaid    schedule 19.05.2017    source источник


Ответы (1)


я копался в тестах для sdf_pivot, и кажется, что вы можете использовать invoke внутри пользовательской функции fun.aggregate для доступа к функции collect_list:

 fun.aggregate <- function(gdf) {

  expr <- invoke_static(
    sc,
    "org.apache.spark.sql.functions",
    "expr",
    "collect_list(y)" #this is your own "y" variable
  )

  gdf %>% invoke("agg", expr, list())
}

который вы затем можете использовать в sdf_pivot:

d_sdf_wide <- sdf_pivot(d_sdf, id ~ x, fun.aggregate)

это делает работу:

> d_sdf_wide
Source:     table<sparklyr_tmp_69c14424c5a4> [?? x 3]
Database:   spark connection master=local[8] app=sparklyr local=TRUE

     id      `200`      `201`
  <chr>     <list>     <list>
1     1 <list [2]> <list [1]>
2     2 <list [1]> <list [2]>

(ваши данные теперь в формате list, а не в виде строки, но вы можете объединить списки, если хотите, например

d_sdf_wide %>% mutate(liststring = paste(`200`))

     id      `200`      `201` liststring
  <chr>     <list>     <list>      <chr>
1     1 <list [2]> <list [1]>  This That
2     2 <list [1]> <list [2]>        The

(в качестве альтернативы вы можете написать сложный sql-запрос, но я не пробовал)

person Janna Maas    schedule 24.05.2017
comment
Не могли бы вы помочь мне ответить на это: stackoverflow.com/questions/44399954/ - person Maggie; 07.06.2017