2017-10-18 6 views
0

J'essaie de passer une fonction R personnalisée à l'intérieur de spark_apply, mais je continue de rencontrer des problèmes et je n'arrive pas à comprendre ce que signifient certaines erreurs.sparklyr spark_apply erreur de fonction définie par l'utilisateur

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") 

Répondre

0

Ok, je vois deux problèmes possibles.

(1) préfère -spark_apply fonctions qui ont un paramètre, une trame de données

(2) peut avoir besoin de -you faire un paquet en fonction de la complexité de la fonction.

disons que vous modifiez ndcg pour recevoir une trame de données en tant que paramètre.

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) 
} 

Et vous le mettre dans un paquet appelé ndcg_package

maintenant votre code sera semblable à:

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

Faire cela de la mémoire, donc il peut y avoir quelques fautes de frappe, mais Je vais te rapprocher.