我正在尝试创建一个Pyspark管道来运行一个分类模型。我的数据集中有一个字符串类型的列。因此,我使用’StringIndexer’将其转换为数字,然后在管道中应用模型。
我的管道只有两个阶段:StringIndexer和ClassificationModel
StringIndexer创建了一个带有索引的新列,但旧列也被保留。我想在管道中引入一个新的转换器来删除’string’列。这可能吗?
在StringIndexer中是否有其他方法可以删除实际的列?
谢谢
回答:
是的,你可以扩展abstract class Transformer
并创建你自己的转换器来删除不需要的列。
这应该看起来像下面这样:
import org.apache.spark.ml.Transformerimport org.apache.spark.ml.param.ParamMapimport org.apache.spark.ml.util.Identifiableimport org.apache.spark.sql.{DataFrame, Dataset}import org.apache.spark.sql.types.{ ArrayType, StringType, StructField, StructType}import org.apache.spark.sql.functions.collect_listclass Dropper(override val uid: String) extends Transformer { def this() = this(Identifiable.randomUID("dropper")) override def transform(dataset: Dataset[_]): DataFrame = { dataset.drop("your-column-name-here") } override def copy(extra: ParamMap): Transformer = defaultCopy(extra) override def transformSchema(schema: StructType): StructType = { //这里你应该编写结果模式,即不包含被删除列的模式 }}
我已经这样做了一段时间,效果很好。
请注意,你也可以扩展abstract class Estimator
。
希望这对你有帮助。祝好