2017-08-07 84 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'。 –