【问题标题】:Dropping columns by data type in Scala Spark在 Scala Spark 中按数据类型删除列
【发布时间】:2018-11-27 14:48:02
【问题描述】:

df1.printSchema() 打印出列名和它们拥有的数据类型。

df1.drop($"colName") 将按名称删除列。

有没有办法让这个命令改为按数据类型删除?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    如果您希望根据类型删除数据框中的特定列,那么下面的 sn-p 会有所帮助。在此示例中,我有一个数据框,其中分别包含两列 String 和 Int 类型。我正在根据其类型从架构中删除我的字符串(所有类型为 String 的字段都将被删除)字段。

    import sqlContext.implicits._
    
    val df = sc.parallelize(('a' to 'l').map(_.toString) zip (1 to 10)).toDF("c1","c2")
    
    df.schema.fields
        .collect({case x if x.dataType.typeName == "string" => x.name})
        .foldLeft(df)({case(dframe,field) => dframe.drop(field)})
    

    newDf 的架构是org.apache.spark.sql.DataFrame = [c2: int]

    【讨论】:

    • 如何将这种方法应用于嵌套列?它不适用于 Struct 或 Array 类型列中的列。
    • 您将不得不解开结构并使用除您要删除的字段之外的所有字段重新创建结构。 Array 类型也必须遵循类似的原则。
    【解决方案2】:

    这是 scala 中的一种奇特方式:

    var categoricalFeatColNames = df.schema.fields filter { _.dataType.isInstanceOf[org.apache.spark.sql.types.StringType] } map { _.name }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2018-09-27
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多