Spark + Scala用于StringIndexer multipl列的新管线

时间:2019-02-02 21:18:36

标签: scala apache-spark

我尝试在多列上应用StringIndexer(),我使用 Scala Spark 2.3。
这是我的代码:

val df1 = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load("file:///c:/tmp/spark-warehouse/train.csv")

val feat = df1.columns.filterNot(_ .contains("BsmtFinSF1"))

val inds = feat.map { colName =>
  val indexer1 = new StringIndexer()
    .setInputCol(colName)
    .setOutputCol(colName + "I")
    .fit(df1)

  Array(indexer1)
}

val pipeline = new Pipeline().setStages(inds.toArray)

但是,我有这个错误:

  

错误:(134,50)类型不匹配;

     

找到了:Array [Array [org [ap.apache.spark.ml.feature.StringIndexerModel]]
  必需:Array [? <:org.apache.spark.ml.PipelineStage]

     

注意:Array [org.apache.spark.ml.feature.StringIndexerModel]>: <:org.apache.spark.ml.PipelineStage,但类Array是在类型T不变   您可能希望研究通配符类型,例如_ >: ? <: org.apache.spark.ml.PipelineStage。 (SLS 3.2.10)
     val pipe = new Pipeline()。setStages(inds.toArray)

任何帮助将不胜感激。 谢谢

1 个答案:

答案 0 :(得分:0)

.setStages需要一个Array[PipelineStage],但实际上它成为Array[Array[PipelineStage],因为您缠绕indexer1这里到冗余阵列:Array(indexer1)。 Map函数返回相同类型的集合。此集合的元素是通过传递给Map的函数的应用程序生成的。所以就这样尝试:

val inds = feat.map { colName =>
   new StringIndexer()
    .setInputCol(colName)
    .setOutputCol(colName + "I")
    .fit(df1)          
}