过滤掉特定列具有 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")
我有一个数据集,在某些行中,属性值为 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")