【问题标题】:Only need to process specific columns in my Spark DataFrame只需要处理我的 Spark DataFrame 中的特定列
【发布时间】:2019-01-12 05:33:27
【问题描述】:

我一直在使用这个答案link,但我有更具体的需求。

我只需要选择以“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,...

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    您为什么要从数据框中选择获取列?为什么不过滤所有名称:

    val transformers: Array[PipelineStage] = df.columns.filter(_.startsWith("cat")).map(
      cname =>
        new StringIndexer()
          .setInputCol(cname)
          .setOutputCol(s"${cname}_index")
      )
    

    【讨论】:

      【解决方案2】:

      这很简单。您只需过滤以“cat”开头的列,如下所示:

      val transformers: Array[PipelineStage] = df.select("cat*").columns.filter(_.startsWith("cat")).map(
                cname =>
                 new StringIndexer()
                    .setInputCol(cname)
                    .setOutputCol(s"${cname}_index")
          )
      

      【讨论】:

      • 很抱歉可能有错字。我在打电话。
      • 我不确定以上 ut,因为文档似乎表明过滤器作用于行而不是列。让我试试。谢谢!
      • 如果您解构代码,columns 方法会返回一个收集,您可以在其上应用过滤器(类似于您在 RDD 上使用的过滤器,但不一样)然后是地图。
      猜你喜欢
      • 2019-09-27
      • 2019-01-12
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2016-01-29
      • 2015-11-09
      相关资源
      最近更新 更多