【问题标题】:Spark scala remove columns containing only null valuesSpark scala删除仅包含空值的列
【发布时间】:2021-09-11 01:23:55
【问题描述】:

有没有办法删除只包含空值的 spark dataFrame 的列? (我使用的是 scala 和 Spark 1.6.2)

目前我正在这样做:

var validCols: List[String] = List()
for (col <- df_filtered.columns){
  val count = df_filtered
    .select(col)
    .distinct
    .count
  println(col, count)
  if (count >= 2){
    validCols ++= List(col)
  }
}

构建包含至少两个不同值的列列表,然后在 select() 中使用它。

谢谢!

【问题讨论】:

标签: scala null spark-dataframe


【解决方案1】:

我遇到了同样的问题,我在 Java 中提出了类似的解决方案。在我看来,目前没有其他方法可以做到这一点。

for (String column:df.columns()){
    long count = df.select(column).distinct().count();

    if(count == 1 && df.select(column).first().isNullAt(0)){
        df = df.drop(column);
    }
}

我将删除所有仅包含一个不同值且第一个值为空的列。这样我可以确保我不会删除所有值都相同但不为空的列。

【讨论】:

  • 小修正,for循环中缺少大括号的语法错误。
【解决方案2】:

这是一个 scala 示例,用于删除只查询该数据一次的空列(更快):

def removeNullColumns(df:DataFrame): DataFrame = {
    var dfNoNulls = df
    val exprs = df.columns.map((_ -> "count")).toMap
    val cnts = df.agg(exprs).first
    for(c <- df.columns) {
        val uses = cnts.getAs[Long]("count("+c+")")
        if ( uses == 0 ) {
            dfNoNulls = dfNoNulls.drop(c)
        }
    }
    return dfNoNulls
}

【讨论】:

  • varreturn 的使用:不是惯用的 Scala。
  • @jwvh return 关键字可以轻松删除。避免使用var 意味着使用.select() 而不是.drop(),因为后者不支持数组。恕我直言,没有任何改变使它更具可读性。
【解决方案3】:

@swdev 答案的更惯用版本:

private def removeNullColumns(df:DataFrame): DataFrame = {
  val exprs = df.columns.map((_ -> "count")).toMap
  val cnts = df.agg(exprs).first
  df.columns
    .filter(c => cnts.getAs[Long]("count("+c+")") == 0)
    .foldLeft(df)((df, col) => df.drop(col))
}

【讨论】:

    【解决方案4】:

    如果数据框大小合理,我将其写为 json,然后重新加载。动态架构将忽略空列,您将拥有更轻量的数据框。

    scala sn-p:

    originalDataFrame.write(tempJsonPath)
    val lightDataFrame = spark.read.json(tempJsonPath)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 2020-04-07
      • 2021-12-07
      • 2013-01-03
      • 2020-07-05
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多