2017-08-07 46 views
1

我想用spark来产生combn()函数的输出,用于一个相对较大的输入列表(200 ish)和变化的值m( 2-5),但是我遇到了麻烦,包括spark_apply()我怎样才能使用spark_apply()来产生组合使用combn()

我目前的做法(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()期待的“矢量源”,这不是我所提供的select()?还是说select没有返回“一个对象(通常是Spark_tbl)可以被Spark 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))) 
+1

我刚刚找到了'expand.grid()'函数。在这种特殊情况下,我认为我不需要它,但我希望我会为下一部分工作做好准备。我会感兴趣的是,如果有一个使用spark来应用的例子,如果可能的话 – DaveRGP

回答

1

这个问题似乎是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 
+0

感谢您的解决方案,以及我知道您在项目中所做的工作。一个小的扩展问题,因为我没有意识到需要“名称”的论点。为什么它是必需的,当输出的长度非常大时,你会如何建议提供它的值?我试验成功了'as.character(c(1:choose(3,2)))'。有什么更合适的吗? – DaveRGP

+0

另外,从'combn'的文档中:“Factor x从R 3.1.0被接受(尽管巧合的是它们在早期版本中用于简化= FALSE)。”所以,你的意思是文档不正确/不完整,或者火花一侧幕后有什么事情阻止它使用因素? – DaveRGP

+1

正确,根据您的建议生成名称似乎很合理。关于'combn'确实支持因素,我应该说使用因素作为输入会导致产生因素,强制'as.character'会使'combn'的结果变成一个'矩阵',它可以被封装成数据.frame'。我们需要确保'spark_apply()'函数返回一个数据帧,可能有其他(更好的)方法来实现'combn'。 –