【问题标题】:SparkR Error in UseMethod("predict")使用方法中的 SparkR 错误(“预测”)
【发布时间】:2017-12-10 15:37:25
【问题描述】:

按照 ALS 示例 here

...但在分布式模式下运行,例如

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[*]")

以前有人遇到过这个问题吗?

【问题讨论】:

  • 您是在本地运行它还是通过spark-submit 在集群中运行它?为什么你在脚本中设置所有这些提交参数?您是否明确使用library(SparkR) in your script
  • 我正在运行这是分布式模式,这就是额外的参数在 session() 中的原因。是的,我在脚本中明确调用library(SparkR)。补充一下,我最后使用 Spark 2.1.1 解决了这个问题,这是我设法让它工作的唯一版本。
  • 再一次,这些额外的参数不是通常的过程(通常你在命令行中提供它们)。一旦你解决了问题,最好回答你自己的问题,以便将来对其他人有用。
  • 从 RStudio 中启动 Spark 时需要这些参数。

标签: r apache-spark machine-learning apache-spark-mllib sparkr


【解决方案1】:

虽然我没有完全重现您的错误(我得到了一个不同的错误),但很可能问题出在您的 predict 调用的第二个参数中,它应该是 newData,而不是 data(请参阅documentation)。

这是您的代码的改编版,适用于从 RStudio 本地运行的 Spark 2.2.0:

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) 也可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多