要处理spark ml管道中新的和看不见的标签,我想使用最频繁的插补。 如果管道包含3个步骤
假设(1)和(2,3)和(4,5)构成单独的管道
以下
val fittedLabels = pipeline23.stages collect { case a: StringIndexerModel => a }
val result = categoricalColumns.zipWithIndex.foldLeft(validationData) {
(currentDF, colName) =>
currentDF
.withColumn(colName._1, when(currentDF(colName._1) isin (fittedLabels(colName._2).labels: _*), currentDF(colName._1))
.otherwise(lit(null)))
}.drop("replace")
用null
然而,这种设置非常难看。像CrossValidator这样的工具不再有效(因为我无法提供单一管道)
如何访问管道中的拟合标签以构建一个Transformer,它处理将新值设置为null?
您是否看到了更好的方法来完成处理新值? 我假设最频繁的估算是正确的,即对于具有大约90列的数据集,只有极少数列将包含看不见的标签。
答案 0 :(得分:0)
我终于意识到这个功能需要驻留在管道中才能正常工作,即需要一个额外的新PipelineStage组件。