为什么使用 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。
我得到一个 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。