过滤掉某些列

时间:2015-05-27 07:23:14

标签: scala apache-spark apache-spark-sql

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

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

我尝试了几种变体,但我似乎无法让它发挥作用。

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

3 个答案:

答案 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")