2017-10-18 93 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") 

这样做从内存中,所以可能会有几个错别字,但它会让你接近。