过滤掉特定列具有 NaN 值的行

Filter out rows with NaN values for certain column

我有一个数据集,在某些行中,属性值为 NaN。该数据被加载到数据框中,我只想使用由所有属性都具有值的行组成的行。我尝试通过 sql:

val df_data = sqlContext.sql("SELECT * FROM raw_data WHERE attribute1 != NaN")

我尝试了几种变体,但似乎无法正常工作。

另一种选择是将其转换为 RDD,然后对其进行过滤,因为过滤此数据帧以检查属性 isNaN 是否不起作用。

这是一些示例代码,向您展示了我的做法 -

import sqlContext.implicits._
val df = sc.parallelize(Seq((1, 0.5), (2, Double.NaN))).toDF("id", "value")
val df2 = df.explode[Double, Boolean]("value", "isNaN")(d => Seq(d.isNaN))

df 将有 -

df.show

id value
1  0.5  
2  NaN

在 df2 上进行过滤会给你想要的东西 -

df2.filter($"isNaN" !== true).show

id value isNaN
1  0.5   false 

我知道你接受了另一个答案,但你可以在没有 explode 的情况下做到这一点(这应该比将你的 DataFrame 大小加倍更好)。

在 Spark 1.6 之前,您可以像这样使用 udf

def isNaNudf = udf[Boolean,Double](d => d.isNaN)
df.filter(isNaNudf($"value"))

从 Spark 1.6 开始,您现在可以像这样使用内置 SQL function isnan()

df.filter(isnan($"value"))

这个有效:

where isNaN(tau_doc) = false

例如

val df_data = sqlContext.sql("SELECT * FROM raw_data where isNaN(attribute1) = false")