我得到一个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"
我应该自己编写一个编码器吗?
答案 0 :(得分:0)
问题是有原因的。
找不到org.apache.spark.ml.regression.LinearRegressionModel的编码器
一旦你掌握了Dataset数据抽象的真正含义以及编码器的目的,代码就没有多大意义。
实质上,首先准备数据集(作为数据集上的转换集合),并且只有在数据集准备就绪时才训练模型(又名 fit 模型)。该模型将在数据集范围之外,您将看不到异常。
当您调用foreach
时发生异常的原因是,当您触发计算时,Spark会尝试执行代码。
我应该自己编写一个编码器吗?
哦,不。按照Machine Learning Library (MLlib) Guide中的指南重写代码,并查看一些示例以了解如何使用API。