scala - Spark + scala 用于 StringIndexer 多列的新管道
问题描述
我尝试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.apache.spark.ml.feature.StringIndexerModel]]
需要:Array[? <:org.apache.spark.ml.PipelineStage]注意:数组[org.apache.spark.ml.feature.StringIndexerModel] >: ? <: org.apache.spark.ml.PipelineStage,但类 Array 在类型 T 中是不变的。您可能希望研究通配符类型,例如
_ >: ? <: org.apache.spark.ml.PipelineStage
. (SLS 3.2.10)
val pipeline = new Pipeline().setStages(inds.toArray)
任何帮助将不胜感激。谢谢你
解决方案
.setStages
需要一个Array[PipelineStage]
,但实际上它变成了Array[Array[PipelineStage]
因为你indexer1
在这里换成了多余的 Array: Array(indexer1)
。Map 函数返回一个相同类型的集合。该集合的元素是由传递给 Map 的函数的应用程序产生的。所以试试这样:
val inds = feat.map { colName =>
new StringIndexer()
.setInputCol(colName)
.setOutputCol(colName + "I")
.fit(df1)
}
推荐阅读
- batch-file - 从 .bat 文件调用时,.net 核心控制台应用程序未运行
- c# - The specified path, file name, or both are too long. C# Azure Chat bot error
- android - Retrofit 中的空对象引用
- opencv - 使用齐次变换的坐标变换期间的乘法顺序
- javascript - 将图像添加到 iframe 标签上的背景 youtube 视频
- java - BEA-160228 LoggerFactory Logback LoggerContext. Either remove Logback... Weblogic springboot
- unity3d - 为什么 Unity 中的 Physics2D Raycast 未检测到对象?
- firebase - 如何从firebase获取JSON数据,然后在角度6中使用它,firebase返回带有值标签的数据
- javascript - Get dynamically jquery populated textbox value onchange
- amazon-s3 - 使用 webpack 将资产上传到 S3