Apache Spark的线性回归

时间:2014-11-11 18:10:40

标签: apache-spark linear-regression apache-spark-mllib

我们必须在数百万个小数据集上运行线性回归,并存储每个数据集的权重和截距。我编写了下面的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中分发此类计算?

1 个答案:

答案 0 :(得分:0)

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

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