过滤掉某些列的NaN值的行

Oli*_*s_j 5 scala apache-spark apache-spark-sql

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

val df_data = sqlContext.sql("SELECT * FROM raw_data WHERE attribute1 != NaN")
Run Code Online (Sandbox Code Playgroud)

我尝试了几个变种,但我似乎无法让它工作.

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

Dav*_*fin 11

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

在Spark 1.6之前,您可以使用udf如下:

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

从Spark 1.6开始,您现在可以使用内置的SQL函数, isnan()如下所示:

df.filter(isnan($"value"))
Run Code Online (Sandbox Code Playgroud)


小智 2

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

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))
Run Code Online (Sandbox Code Playgroud)

df 将有 -

df.show

id value
1  0.5  
2  NaN
Run Code Online (Sandbox Code Playgroud)

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

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

id value isNaN
1  0.5   false 
Run Code Online (Sandbox Code Playgroud)