我有一个数据集,在某些行中,属性值为NaN
。这个数据被加载到一个数据框中,我想只使用由所有属性都有值的行组成的行。我试过通过sql:
val df_data = sqlContext.sql("SELECT * FROM raw_data WHERE attribute1 != NaN")
我尝试了几种变体,但我似乎无法让它发挥作用。
另一种选择是将其转换为RDD然后对其进行过滤,因为过滤此数据框以检查属性isNaN
是否无效。
答案 0 :(得分:10)
我知道您接受了另一个答案,但是您可以在没有udf
的情况下执行此操作(这应该比使用DataFrame大小加倍更好)。
在Spark 1.6 之前,你可以像这样使用def isNaNudf = udf[Boolean,Double](d => d.isNaN)
df.filter(isNaNudf($"value"))
:
isnan()
从Spark 1.6 开始,您现在可以像这样使用内置的SQL function df.filter(isnan($"value"))
:
{{1}}
答案 1 :(得分: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))
df会有 -
df.show
id value
1 0.5
2 NaN
在df2上进行过滤时会给你你想要的东西 -
df2.filter($"isNaN" !== true).show
id value isNaN
1 0.5 false
答案 2 :(得分:2)
这有效:
where isNaN(tau_doc) = false
e.g。
val df_data = sqlContext.sql("SELECT * FROM raw_data where isNaN(attribute1) = false")