Spark 3.2.0 Scala环境下LinearRegressionWithSGD实例化失败求助
解决方案:Spark 3.2.0中LinearRegressionWithSGD的正确使用方式
1. API变更说明
Spark 3.x版本里,org.apache.spark.mllib.regression.LinearRegressionWithSGD的构造器被设置为私有,不再允许通过new直接实例化。同时,这套基于RDD的旧mllib API已进入维护状态,官方更推荐使用基于DataFrame的新ml API。
2. 旧mllib API的使用方法
如果必须沿用旧API,不要尝试实例化类,直接调用其静态train方法训练模型:
import org.apache.spark.mllib.regression.LinearRegressionWithSGD import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.mllib.linalg.Vectors // 构造训练数据 val data = sc.parallelize(Seq( LabeledPoint(1.0, Vectors.dense(0.0, 1.0)), LabeledPoint(2.0, Vectors.dense(1.0, 2.0)), LabeledPoint(3.0, Vectors.dense(2.0, 3.0)) )) // 直接调用静态train方法生成模型 val model = LinearRegressionWithSGD.train(data, iterations = 100, stepSize = 0.01)
3. 推荐方案:迁移到新ml API
官方推荐使用org.apache.spark.ml.regression.LinearRegression,它支持DataFlow、Pipeline、交叉验证等更多特性,实现分组线性回归的示例如下:
import org.apache.spark.ml.regression.LinearRegression import org.apache.spark.ml.feature.VectorAssembler import org.apache.spark.sql.functions.col // 构造分组训练数据 val df = spark.createDataFrame(Seq( ("group1", 0.0, 1.0, 1.0), ("group1", 1.0, 2.0, 2.0), ("group2", 2.0, 3.0, 3.0), ("group2", 3.0, 4.0, 4.0) )).toDF("group", "feat1", "feat2", "label") // 按分组训练模型 val groupedModels = df.groupBy("group").mapGroups { case (groupKey, rows) => val groupDf = spark.createDataFrame(rows) // 组装特征向量 val assembler = new VectorAssembler() .setInputCols(Array("feat1", "feat2")) .setOutputCol("features") val assembledDf = assembler.transform(groupDf) // 训练线性回归模型 val lr = new LinearRegression() .setLabelCol("label") .setFeaturesCol("features") val model = lr.fit(assembledDf) (groupKey, model.coefficients, model.intercept) }.collect() // 输出各分组模型参数 groupedModels.foreach { case (group, coeffs, intercept) => println(s"分组:$group,系数:$coeffs,截距:$intercept") }
核心提示
- 旧mllib API的
LinearRegressionWithSGD仅支持RDD输入,只能通过静态train方法调用; - 新ml API功能更完善,适配Spark现代数据处理流程,且会持续得到官方更新;
- 实现分组回归时,新API可通过
groupBy.mapGroups为每个分组单独训练模型。
内容的提问来源于stack exchange,提问作者gffryclrk
相关产品推荐
相关产品推荐

