2017-07-06 81 views
0

繼ALS示例hereSparkR錯誤( 「預測」)

...但在分佈式模式下,例如運行

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) 

我得到以下錯誤:

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

望着source for 2.1.1方法似乎存在,那就是直接上面定義的summary()功能工作得很好。

我試着用Spark,2.1.0,2.1.1和2.2.0-rc6,所有這些都給出了相同的結果。此外,這不限於ALS模型,因爲任何模型都會調用predict()給出相同的錯誤。

我在本地模式下運行時也會出現同樣的錯誤,例如:

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

有沒有人碰到這個問題之前來的呢?

+0

你是通過'spark-submit'在本地還是集羣運行?爲什麼你將所有這些提交參數設置爲腳本?你是否明確地在腳本中使用'庫(SparkR)? – desertnaut

+0

我正在運行這是分佈式模式,這就是爲什麼額外的參數在session()中。是的,我正在腳本中明確調用'library(SparkR)'。 只需要添加,我最終通過使用Spark 2.1.1解決了這個問題,這是我設法使用它的唯一版本。 – dtsbg

+0

再一次,這些額外的參數不是通常的過程(通常你在命令行中提供它們)。一旦你解決了這個問題,回答你自己的問題是一個很好的做法,以便將來可能對其他人有用。 – desertnaut

回答

0

我雖然不完全複製你的錯誤(我得到一個不同的),最有可能的問題是在你的predict調用的第二個參數,這應該是newData,而不是data(見documentation)。

這裏是你的代碼爲Spark 2.2.0適應從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| 
# +----+----+------+----------+ 

一個簡單的predict(model, df)也會起作用。