0

Nach dem ALS Beispiel hereSparkR Fehler in UseMethod ("vorhersagen")

... aber in verteilten Modus ausgeführt wird, z.B.

Sys.setenv("SPARKR_SUBMIT_ARGS"="--master yarn sparkr-shell") 
spark <- sparkR.session(master = "yarn", 
        sparkConfig = list(
         spark.driver.memory = "2g", 
         spark.driver.extraJavaOptions = 
         paste("-Dhive.metastore.uris=", 
           Sys.getenv("HIVE_METASTORE_URIS"), 
           " -Dspark.executor.instances=", 
           Sys.getenv("SPARK_EXECUTORS"), 
           " -Dspark.executor.cores=", 
           Sys.getenv("SPARK_CORES"), 
           sep = "") 
        )) 


ratings <- list(list(0, 0, 4.0), list(0, 1, 2.0), list(1, 1, 3.0), list(1, 2, 4.0),list(2, 1, 1.0), list(2, 2, 5.0)) 
df <- createDataFrame(ratings, c("user", "item", "rating")) 
model <- spark.als(df, "rating", "user", "item") 
stats <- summary(model) 
userFactors <- stats$userFactors 
itemFactors <- stats$itemFactors 
# make predictions 
summary(model) 
predicted <- predict(object=model, data=df) 

bekomme ich folgende Fehlermeldung:

Error in UseMethod("predict") : 
    no applicable method for 'predict' applied to an object of class "ALSModel" 

am source for 2.1.1 Blick das Verfahren zu existieren scheint, und die summary() Funktion, die oben definiert ist, arbeitet direkt gut.

Ich habe mit Spark, 2.1.0, 2.1.1 und 2.2.0-rc6 versucht, die alle das gleiche Ergebnis geben. Dies ist auch nicht auf das ALS-Modell beschränkt, das Aufrufen von predict() für irgendein Modell ergibt den gleichen Fehler.

Ich bekomme auch den gleichen Fehler, wenn ich es im lokalen Modus, z.

spark <- sparkR.session("local[*]") 

Hat jemand schon einmal auf dieses Problem gestoßen?

+0

Führen Sie dies lokal oder in einem Cluster über 'spark-submit' aus? Und wieso genau stellst du all diese Argumente in-Skript einreichen? Verwenden Sie explizit Bibliothek (SparkR) in Ihrem Skript? – desertnaut

+0

Ich betreibe das ist verteilter Modus, weshalb die zusätzlichen Argumente in der Sitzung() sind. Und ja, ich rufe 'library (SparkR)' explizit im Skript an. Nur um hinzuzufügen, löste ich es mit Spark 2.1.1 am Ende, das war die einzige Version, die ich es geschafft, damit zu arbeiten. – dtsbg

+0

Wieder sind diese zusätzlichen Argumente nicht üblich (normalerweise geben Sie sie in der Befehlszeile an). Und wenn Sie das Problem gelöst haben, ist es eine gute Übung, Ihre eigene Frage zu beantworten, damit sie für andere in Zukunft nützlich sein kann. – desertnaut

Antwort

0

Obwohl ich nicht genau Ihre Fehler reproduziert haben (ich ein anderes), höchstwahrscheinlich das Problem ist in dem zweiten Argument Ihrer predict Anruf, der newData sein sollte, und nicht data (siehe documentation).

Hier ist eine Anpassung des Codes für Spark 2.2.0 lokal ausgeführt von RStudio:

library(SparkR, lib.loc = "/home/ctsats/spark-2.2.0-bin-hadoop2.7/R/lib") # change the path accordingly here 

sparkR.session(sparkHome = "/home/ctsats/spark-2.2.0-bin-hadoop2.7")  # and here 

ratings <- list(list(0, 0, 4.0), list(0, 1, 2.0), list(1, 1, 3.0), list(1, 2, 4.0),list(2, 1, 1.0), list(2, 2, 5.0)) 
df <- createDataFrame(ratings, c("user", "item", "rating")) 
model <- spark.als(df, "rating", "user", "item") 
stats <- summary(model) 
userFactors <- stats$userFactors 
itemFactors <- stats$itemFactors 
# make predictions 
summary(model) 
predicted <- predict(object=model, newData=df) # newData here 
showDF(predicted) 
# +----+----+------+----------+ 
# |user|item|rating|prediction| 
# +----+----+------+----------+ 
# | 1.0| 1.0| 3.0| 2.810426| 
# | 2.0| 1.0| 1.0| 1.0784092| 
# | 0.0| 1.0| 2.0| 1.997412| 
# | 1.0| 2.0| 4.0| 3.9731808| 
# | 2.0| 2.0| 5.0| 4.8602753| 
# | 0.0| 0.0| 4.0| 3.8844662| 
# +----+----+------+----------+ 

Eine einfache predict(model, df) wird auch funktionieren.