2017-10-18 53 views
0

我想傳遞一個自定義的一個R函數裏面spark_apply但繼續運行到問題,並不能找出一些錯誤的意思。sparklyr spark_apply用戶定義函數的錯誤

library(sparklyr) 
sc <- spark_connect(master = "local") 
perf_df <- data.frame(predicted = c(5, 7, 20), 
         actual = c(4, 6, 40)) 


perf_tbl <- sdf_copy_to(sc = sc, 
         x = perf_df, 
         name = "perf_table") 

#custom function 
ndcg <- function(predicted_rank, actual_rank) { 
    # x is a vector of relevance scores 
    DCG <- function(y) y[1] + sum(y[-1]/log(2:length(y), base = 2)) 
    DCG(predicted_rank)/DCG(actual_rank) 
} 

#works in R using R data frame 
ndcg(perf_df$predicted, perf_df$actual) 


    #does not work 
    perf_tbl %>% 
    spark_apply(function(e) ndcg(e$predicted, e$actual), 
       names = "ndcg") 

回答

0

好吧,我看到兩個可能的問題。

(1)-spark_apply更喜歡有一個參數,一個數據幀功能

(2) - 您可能需要根據多麼複雜的功能,使一個包。

假設您修改NDCG接收數據幀作爲參數。

ndcg <- function(dataset) { 
    predicted_rank <- dataset$predicted 
     actual_rank <- dataset$actual 
     # x is a vector of relevance scores 
     DCG <- function(y) y[1] + sum(y[-1]/log(2:length(y), base = 2)) 
     DCG(predicted_rank)/DCG(actual_rank) 
} 

,你把在一個包叫做ndcg_package

現在你的代碼將類似於:

spark_apply(perf_tbl, ndcg, packages = TRUE, names = "ndcg") 

這樣做從內存中,所以可能會有幾個錯別字,但它會讓你接近。