使用 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)
永远不会结束。
此问题的解决方案是什么?
答案 0 :(得分:0)
您的代码的主要问题是您使用驱动程序作为数据的桥梁。即,您正在将所有分布式数据收集到驱动程序并将其传递回所有节点。另一个问题是您实际上使用的是ML
功能,这意味着您 使用DataFrame
而不是RDD
s。因此,您需要做的是将RDD
转换为DataFrame
。请注意,有很多方法可以实现此目的,您可以查看How to convert RDD Object to DataFrame in Spark,另一种方法是使用toDF方法。