我一直在使用这个答案链接,但我有更具体的需求。
我只需要选择以"cat"开头的列。我无法确定如何根据模式选择列。我不需要过滤数据框,只选择名称以模式开头的列。
val transformers: Array[PipelineStage] = df.select("cat*").columns.map(
cname =>
new StringIndexer()
.setInputCol(cname)
.setOutputCol(s"${cname}_index")
)
val stages: Array[PipelineStage] = transformers
val pipeline = new Pipeline().setStages(stages)
val model = pipeline.fit(df)
这段代码产生一个错误:
org.apache.spark.sql.AnalysisException: cannot resolve 'cat*' given input columns: [cat3, cat7, cat25,...
为什么要从数据框中选择列呢?为什么不直接过滤掉所有的名字呢?
val transformers: Array[PipelineStage] = df.columns.filter(_.startsWith("cat")).map(
cname =>
new StringIndexer()
.setInputCol(cname)
.setOutputCol(s"${cname}_index")
)
这很简单。您只需对以"cat"开头的列进行过滤,如下所示:
val transformers: Array[PipelineStage] = df.select("cat*").columns.filter(_.startsWith("cat")).map(
cname =>
new StringIndexer()
.setInputCol(cname)
.setOutputCol(s"${cname}_index")
)