2017-10-18 8 views
0

Ich versuche, eine benutzerdefinierte R-Funktion innerhalb von spark_apply zu übergeben, aber laufe weiterhin in Probleme und kann nicht herausfinden, was einige der Fehler bedeuten.sparklyr spark_apply benutzerdefinierter Funktionsfehler

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

Antwort

0

Ok, ich sehe zwei mögliche Probleme.

(1) -spark_apply bevorzugt Funktionen, die einen Parameter, einen Datenrahmen

(2): Sie können ein Paket je nachdem, wie komplex die Funktion in vornehmen müssen.

wir Sie ndcg ändern sagen um einen Datenrahmen als Parameter zu erhalten.

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

Und setzen Sie, dass in einem Paket ndcg_package genannt

jetzt wird Ihr Code ähnlich sein:

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

dies aus dem Gedächtnis tun, so kann es ein paar Fehler, aber es Ich werde dich näher bringen.