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)
| 归档时间: |
|
| 查看次数: |
12289 次 |
| 最近记录: |