Допустим, у меня есть следующий фрейм данных:
/*
+---------+--------+----------+--------+
|a |b | c |d |
+---------+--------+----------+--------+
| bob| -1| 5| -1|
| alice| -1| -1| -1|
+---------+--------+----------+--------+
*/
Я хочу удалить столбцы, которые имеют только -1
во всех строках (в данном случае b
и d
).Я нашел решение, но когда я запустил свою работу, я обнаружил, что она очень неэффективна:
private def removeEmptyColumns(df: DataFrame): DataFrame = {
val types = List("IntegerType", "DoubleType", "LongType")
val dTypes: Array[(String, String)] = df.dtypes
dTypes.foldLeft(df)((d, t) => {
val colType = t._2
val colName = t._1
if (types.contains(colType)) {
if (colType.equals("IntegerType")) {
if (d.select(colName).filter(col(colName) =!= -1).take(1).length == 0) d.drop(colName)
else d
} else if (colType.equals("DoubleType")) {
if (d.select(colName).filter(col(colName) =!= -1.0).take(1).length == 0) d.drop(colName)
else d
} else {
if (d.select(colName).filter(col(colName) =!= -1).take(1).length == 0) d.drop(colName)
else d
}
} else {
d
}
})
}
Есть ли лучшее решение или способ улучшить мой существующий код?
(я думаю, что этолиния val count = d.select(colName).distinct.count
является узким местом)
Я использую Spark 2.2 атм.
Большое спасибо