【问题标题】:Filter out rows with NaN values for certain column过滤掉特定列的具有 NaN 值的行
【发布时间】:2017-06-07 00:15:48
【问题描述】:

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

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

我对此尝试了几种变体,但似乎无法使其正常工作。

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

【问题讨论】:

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


    【解决方案1】:

    我知道你接受了另一个答案,但你可以在没有 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"))
    

    【讨论】:

    • df.filter(isnan($"value")) 返回所有“value”为 NaN 的行,对吗?
    【解决方案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 
    

    【讨论】:

      【解决方案3】:

      这行得通:

      where isNaN(tau_doc) = false
      

      例如

      val df_data = sqlContext.sql("SELECT * FROM raw_data where isNaN(attribute1) = false")
      

      【讨论】:

        猜你喜欢
        • 2017-10-04
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-05
        • 2018-10-21
        • 2013-01-13
        • 2021-07-22
        相关资源
        最近更新 更多