0

我们有一种情况,我们必须对数百万个小数据集运行线性回归,并存储每个数据集的权重和截距。我编写了下面的 scala 代码来执行此操作,其中我将这些数据集中的每一个作为 RDD 中的一行提供,然后我尝试对每个数据集运行回归(数据是 RDD,其中存储了(标签,特征)在每个行,在这种情况下,每个标签都有一个特征):

val x = data.flatMap { line => line.split(' ')}.map { line =>
  val parts = line.split(',')
  val parsedData1 = LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble)))
  val model = LinearRegressionWithSGD.train(sc.parallelize(List(parsedData1)),100)//using parallelize to convert data to type RDD
  (model.intercept,model.weights)
}

这里的问题是,LinearRegressionWithSGD需要一个 RDD 作为输入,而 Spark 不支持嵌套的 RDD。我选择了这种方法,因为所有这些数据集都可以彼此独立运行,因此我想分发它们(因此,排除了循环)。您能否建议我是否可以使用其他类型(数组、列表等)作为数据集输入到LinearRegressionWithSGD,或者甚至是一种更好的方法,仍然可以在 Spark 中分配此类计算?

4

1 回答 1

0
val modelList = for {item <- dataSet} yield {
    val data = MLUtils.loadLibSVMFile(context, item).cache()
    val model = LinearRegressionWithSGD.train(data)
    model
}

也许您可以将输入数据分成几个文件并存储在 HDFS 中。使用这些文件的目录作为输入,您可以获得模型列表。

于 2015-01-25T14:30:24.873 回答