Удалить столбцы из Dataframe, которые имеют одно значение (более эффективное) - PullRequest
0 голосов
/ 16 мая 2018

Допустим, у меня есть следующий фрейм данных:

   /*
+---------+--------+----------+--------+
|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 атм.

Большое спасибо

1 Ответ

0 голосов
/ 16 мая 2018

Вместо подсчета количества различных значений попробуйте проверить, существует ли какое-либо другое значение, не являющееся -1

d.select(colName).filter(_ != -1).take(1).length == 0

Другой подход

Вместо прохожденияВ кадре данных n раз (один раз для каждого столбца) вы можете попытаться собрать статистику за один раз

val summary = d.agg(
      max(col1).as(s"${col1}_max"), min(col1).as(s"${col1}_min")), 
      max(col2).as(s"${col1}_max"), min(col2).as(s"${col2}_min")), 
       ...)
      .first    

Затем сравните, если min и max значение для столбца одинаковое -1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...