sc.parallelize不使用训练算法在ML管道中工作

时间:2016-05-31 14:25:56

标签: scala apache-spark pyspark apache-spark-mllib apache-spark-ml

使用 org.apache.spark.mllib 学习算法,我们习惯在没有训练算法的情况下设置管道

var stages: Array[org.apache.spark.ml.PipelineStage] = index_transformers :+ assembler
val pipeline = new Pipeline().setStages(stages)

然后我们使用LabeledPoint为训练算法准备好数据,最后我们用像

那样训练模型
val model = GradientBoostedTrees.train(sc.parallelize(trainingData.collect()), boostingStrategy)

我们必须注意,如果我们使用" sc.parallelize" ,培训似乎永远不会结束。

现在使用 org.apache.spark.ml 学习算法(由于setLabelCol& setFeaturesCol),我们也可以在管道中包含训练算法

val model = new GBTRegressor().setLabelCol(target_col_name).setFeaturesCol("features").setMaxIter(10)

var stages: Array[org.apache.spark.ml.PipelineStage] = index_transformers :+ assembler :+ model
val pipeline = new Pipeline().setStages(stages)

但是现在当我们传递数据时,它会超出数据框而不是sc.parallelize所做的数据行 所以下面的代码

val model = pipeline.fit(sc.parallelize(df_train))

引发以下错误:

<console>:57: error: type mismatch;
 found   : org.apache.spark.sql.DataFrame
 required: Seq[?]

虽然这个

val model = pipeline.fit(df_train)

永远不会结束。

此问题的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

您的代码的主要问题是您使用驱动程序作为数据的桥梁。即,您正在将所有分布式数据收集到驱动程序并将其传递回所有节点。另一个问题是您实际上使用的是ML功能,这意味着您 使用DataFrame而不是RDD s。因此,您需要做的是将RDD转换为DataFrame。请注意,有很多方法可以实现此目的,您可以查看How to convert RDD Object to DataFrame in Spark,另一种方法是使用toDF方法。