有没有办法删除只包含空值的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()中使用它。
谢谢 !
我有同样的问题,我想出了一个类似的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);
}
}
我正在删除所有包含一个不同值的列,第一个值为null。这样我可以确定我不会删除所有值相同但不为null的列。
这是一个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
}