我想使用spark来为一个相对较大的输入列表(200ISH)和不同的m值(2-5)生成m函数的输出,但是我在spark_apply()中也遇到了问题。
我目前的方法(基于此)的一个mwe:
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()所期望的“向量源”问题不是select()提供的吗?还是select不返回“一个对象(通常是spark_tbl)可以强制发送给火花DataFrame"?无论哪种方法,我是否可以使用一种方法来达到预期的结果?
我也尝试过这样做,但没有成功:
name_tbl %>%
select(name) %>% # removing this also doesn't work
spark_apply(function(e) combn(e$name, 2))编辑:所以expand.grid工作得很好,这表明combn的返回不能强制进入data.frame存在一些问题。
工作expand.grid
name_tbl %>%
spark_apply(function(e) expand.grid(e))编辑2:
在更仔细地阅读了文档之后,我现在还试着将函数强制转换为data.frame,如下所示:
您的R函数应该设计为在R数据帧上操作。传递给spark_apply的R函数需要一个DataFrame,并将返回一个可以转换为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)))发布于 2017-08-11 00:10:32
问题似乎是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 Cathttps://stackoverflow.com/questions/45550701
复制相似问题