为什么使用 LinearRegressionModel 创建数据集失败并显示 "No Encoder found for org.apache.spark.ml.regression.LinearRegressionModel"?

Why does creating a Dataset with LinearRegressionModel fail with "No Encoder found for org.apache.spark.ml.regression.LinearRegressionModel"?

我得到一个 DataFrame 包含 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"

我要自己写一个Encoder吗?

这个问题是有原因的。

No Encoder found for org.apache.spark.ml.regression.LinearRegressionModel

一旦您了解了 Dataset 数据抽象的真正含义以及编码器的用途,这些代码就没有多大意义了。

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

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

Should I write a Encoder by myself?

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