我如何使用 spark_apply() 来生成使用 combn() 的组合

How can I use spark_apply() to generate combinations using combn()

我想使用 spark 为相对较大的输入列表(200 左右)生成 combn() 函数的输出,并改变 m (2-5) 的值,但是我在 spark_apply().

中包含这个时遇到了问题

我目前的方法 (based on this):

names_df <- data.frame(name = c("Alice", "Bob", "Cat"), 
                   types = c("Human", "Human", "Animal"))

combn(names_df$name, 2)

name_tbl <- sdf_copy_to(sc = sc,
                        x = names_df,
                        name = "name_table")

name_tbl %>%
  select(name) %>%
  spark_apply(function(e) combn(e, 2))

错误消息输出很大,但我无法理解如何使用该信息来改进我的方法。

我希望得到像 MWE 第二行那样的输出。 combn() 期待的 "vector source" 不是我 select() 提供的问题吗?还是 select 不是 returning "An object (usually a spark_tbl) coercable to a Spark DataFrame"?无论哪种方式,有没有一种方法可以用来达到我想要的结果?

我也试过这个,但没有成功:

name_tbl %>%
  select(name) %>% # removing this also doesn't work
  spark_apply(function(e) combn(e$name, 2))

编辑:所以 expand.grid 工作正常,这对我来说表明 combn 的 return 无法被强制转换为 data.frame.

工作expand.grid

name_tbl %>%
  spark_apply(function(e) expand.grid(e))

编辑 2:

仔细阅读文档后,我现在还尝试将函数强制转换为 data.frame,正如它所说:

Your R function should be designed to operate on an R data frame. The R function passed to spark_apply expects a DataFrame and will return an object that can be cast as a DataFrame.

但是,以下也是不成功的:

name_tbl %>%
  spark_apply(function(e) data.frame(combn(e$name, 2)))

name_tbl %>%
  select(name) %>%
  spark_apply(function(e) data.frame(combn(e, 2)))

问题似乎是 combn() 不能与因子一起正常工作,代码还需要命名列,如:

name_tbl %>%
  spark_apply(
    function(e) data.frame(combn(as.character(e$name), 2)),
    names = c("1", "2", "3")
  )

# Source:   table<sparklyr_tmp_626bc0dd927> [?? x 3]
# Database: spark_connection
    `1`   `2`   `3`
  <chr> <chr> <chr>
1 Alice Alice   Bob
2   Bob   Cat   Cat