【发布时间】:2016-05-31 14:25:56
【问题描述】:
使用 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)
永无止境。
这个问题的解决方法是什么?
【问题讨论】:
-
使用数据框
toDF从 RDD 转换到数据框并返回非常容易 - 你只需要添加一个模式(如标题)。 -
@GameOfThrows:对不起,我没明白。 df_train 已经是一个 DataFrame。
标签: scala apache-spark pyspark apache-spark-mllib apache-spark-ml