Как я могу отфильтровать спарк Dataframe в соответствии со значением, содержащимся в этом столбце? - PullRequest
0 голосов
/ 07 июня 2019

В наборе данных, который у меня есть значения None или NA для некоторых строковых столбцов, я хочу подсчитать, сколько из этих значений NULL содержит набор данных? В соответствии с этим решите, какой подход использовать для пропущенных значений.

Я очень эффективно пытался отфильтровать Dataframe для каждого столбца с выражением или. Я хочу отфильтровать их более эффективно и аккуратно. Будет лучше сделать это без преобразования в rdd, но если это невозможно, используя dataframe для такого рода фильтрации, также приемлемый способ rdd.

Я нашел эту тему Spark SQL filter несколько полей так похож на мой вопрос, но я хочу более аккуратный и элегантный способ написать это, потому что у меня так много столбцов

// trainDataFull is my dataframe
val nullValues = Array("NA", "None")

val filtered = trainDataFull.filter(trainDataFull("Alley").isin(nullValues:_*) ||
      trainDataFull("MSZoning").isin(nullValues:_*) ||
      trainDataFull("Street").isin(nullValues:_*) ||
      trainDataFull("LotShape").isin(nullValues:_*) ||
      trainDataFull("LandContour").isin(nullValues:_*) ||
      trainDataFull("Utilities").isin(nullValues:_*) ||
      trainDataFull("LotConfig").isin(nullValues:_*) ||
      trainDataFull("LandSlope").isin(nullValues:_*) ||
      trainDataFull("Neighborhood").isin(nullValues:_*) ||
      trainDataFull("Condition1").isin(nullValues:_*) ||
      trainDataFull("Condition2").isin(nullValues:_*) ||
      trainDataFull("BldgType").isin(nullValues:_*) ||
      trainDataFull("HouseStyle").isin(nullValues:_*) ||
      trainDataFull("RoofStyle").isin(nullValues:_*) ||
      trainDataFull("RoofMatl").isin(nullValues:_*) ||
      trainDataFull("Exterior1st").isin(nullValues:_*) ||
      trainDataFull("Exterior2nd").isin(nullValues:_*) ||
      trainDataFull("MasVnrType").isin(nullValues:_*) ||
      trainDataFull("MasVnrArea").isin(nullValues:_*) ||
      trainDataFull("ExterQual").isin(nullValues:_*) ||
      trainDataFull("MasVnrArea").isin(nullValues:_*) ||
      trainDataFull("ExterQual").isin(nullValues:_*) ||
      trainDataFull("ExterCond").isin(nullValues:_*) ||
      trainDataFull("Foundation").isin(nullValues:_*) ||
      trainDataFull("BsmtQual").isin(nullValues:_*) ||
      trainDataFull("BsmtCond").isin(nullValues:_*) ||
      trainDataFull("BsmtExposure").isin(nullValues:_*)
    )

Я хочу посмотреть, в каком столбце сколько пустых значений.

1 Ответ

0 голосов
/ 07 июня 2019

Вы всегда можете сгенерировать запрос программно

val nullValues = Array("NA", "None")
val df = Seq(("NA", "Foo"), ("None", "NA")).toDF("MSZoning", "Street")
val columns = df.schema.collect {
  case StructField(name, StringType, _, _) =>
    sum(when(col(name).isInCollection(nullValues), 1)).as(name)
}
df.select(columns:_*).show()

Выход:

+--------+------+
|MSZoning|Street|
+--------+------+
|       2|     1|
+--------+------+
...