繁体   English   中英

如何根据列包含的值过滤spark Dataframe?

[英]How can I filter spark Dataframe according to the value that column contains?

在数据集中,我有一些字符串列的无或NA值,我想计算数据集包含多少这些空值? 根据该决定使用哪种方法用于缺失值。

我非常有效地使用或表达式过滤每个列的Dataframe。 我想以更有效和更整洁的方式过滤它们。 最好不要将它转换为rdd,但如果不可能使用数据帧来做这种过滤,那么rdd方式也是可以接受的。

我发现这个线程Spark SQL过滤多个字段与我的问题很相似,但我想要一个更整洁和优雅的方式来编写这个因为我有这么多列

// 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:_*)
    )

我想看看哪个列有多少个空值。

您始终可以以编程方式生成查询

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|
+--------+------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM