Spark scala删除仅包含空值的列

时间:2016-09-11 13:32:29

标签: scala null spark-dataframe

有没有办法删除只包含空值的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()中使用它。

谢谢!

3 个答案:

答案 0 :(得分:4)

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

TestFlight

我正在删除所有包含一个不同值的列,第一个值为null。这样我可以确定我不会删除所有值相同但不为空的列。

答案 1 :(得分:0)

这是一个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
}

答案 2 :(得分:0)

如果数据帧大小合适,我将其写为json,然后重新加载。动态架构将忽略空列,您的数据框会更浅。

scala片段:

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