为什么使用LinearRegressionModel创建数据集失败,并且“找不到org.apache.spark.ml.regression.LinearRegressionModel的编码器”?

时间:2017-09-18 02:40:16

标签: scala apache-spark apache-spark-sql apache-spark-mllib apache-spark-encoders

我得到一个DataFrame contians Tuple(String, org.apache.spark.ml.regression.LinearRegressionModel)

val result = rows.map(row => {
  val userid = row.getString(0)
  val frame = filterByUserId(userid ,dataFrame)
  (userid, lr.fit(frame, "topicDistribution", "s"))
}).toDF()

当我使用foreach函数时,我收到此错误。

 result.foreach(row => {
  val model = row.getAs[LinearRegressionModel](1)
  val userid = row.getString(0)
  model.save(SocialTextTest.userModelPath + userid)
})
Exception in thread "main" java.lang.UnsupportedOperationException: 
No Encoder found for org.apache.spark.ml.regression.LinearRegressionModel
- field (class: "org.apache.spark.ml.regression.LinearRegressionModel", name: "_2")
- root class: "scala.Tuple2"

我应该自己编写一个编码器吗?

1 个答案:

答案 0 :(得分:0)

问题是有原因的。

  

找不到org.apache.spark.ml.regression.LinearRegressionModel的编码器

一旦你掌握了Dataset数据抽象的真正含义以及编码器的目的,代码就没有多大意义。

实质上,首先准备数据集(作为数据集上的转换集合),并且只有在数据集准备就绪时才训练模型(又名 fit 模型)。该模型将在数据集范围之外,您将看不到异常。

当您调用foreach时发生异常的原因是,当您触发计算时,Spark会尝试执行代码。

  

我应该自己编写一个编码器吗?

哦,不。按照Machine Learning Library (MLlib) Guide中的指南重写代码,并查看一些示例以了解如何使用API​​。