2017-07-06 59 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)也会起作用。