我们必须在数百万个小数据集上运行线性回归,并存储每个数据集的权重和截距。我编写了下面的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中分发此类计算?
答案 0 :(得分:0)
val modelList = for {item <- dataSet} yield {
val data = MLUtils.loadLibSVMFile(context, item).cache()
val model = LinearRegressionWithSGD.train(data)
model
}
也许您可以将输入数据分成几个文件并存储在HDFS中。 使用这些文件的目录作为输入,您可以获得模型列表。