Spark scala删除仅包含空值的列

ar5n3qh5  于 2022-12-13  发布在  Scala
关注(0)|答案(5)|浏览(226)

有没有办法删除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()中使用它。
谢谢你,谢谢你

44u64gxh

44u64gxh1#

我遇到了同样的问题,我在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);
    }
}

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

fhity93d

fhity93d2#

下面是一个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
}
vxbzzdmp

vxbzzdmp3#

@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))
}
0md85ypi

0md85ypi4#

如果 Dataframe 的大小合理,我将其写为json,然后重新加载它。动态模式将忽略空列,这样您的 Dataframe 将更小。
scala代码片段:

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

ruyhziif5#

下面是用pySpark语法编写@timo-strotmann解决方案:

for column in df.columns:
    count = df.select(column).distinct().count()
    if count == 1 and df.first()[column] is None:
        df = df.drop(column)

相关问题