【问题标题】:Spark & Scala - Cannot Filter null Values from RDDSpark & Scala - 无法从 RDD 中过滤空值
【发布时间】:2016-12-08 21:35:51
【问题描述】:

我试图从 RDD 中过滤空值但失败了。这是我的代码:

val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],
      classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
      classOf[org.apache.hadoop.hbase.client.Result])

val raw_hbaserdd = hBaseRDD.map{
  kv => kv._2
}

val Ratings = raw_hbaseRDD.map {
      result =>  val x = Bytes.toString(result.getValue(Bytes.toBytes("data"),Bytes.toBytes("user")))
                 val y = Bytes.toString(result.getValue(Bytes.toBytes("data"),Bytes.toBytes("item")))
                 val z = Bytes.toString(result.getValue(Bytes.toBytes("data"),Bytes.toBytes("rating")))

                 (x,y, z)
    }
Ratings.filter ( x => x._1 != null )

Ratings.foreach(println)

调试时,过滤器后仍出现空值:

(3359,1494,4)
(null,null,null)
(28574,1542,5)
(null,null,null)
(12062,1219,5)
(14068,1459,3)

有更好的主意吗?

【问题讨论】:

  • 你做错了。 Ratings.filter(x=>x._1 != null).foreach(println) 将起作用
  • val filteredRatings = Ratings.filter ( x => x._1 != null )filteredRatings.foreach(println)

标签: scala hadoop apache-spark bigdata


【解决方案1】:

RDD 是不可变的对象——对 RDD 的任何转换都不会改变原来的 RDD,而是产生一个新的。所以——如果你想看到filter的效果,你应该使用filter返回的RDD(就像你使用map的结果一样):

val result = Ratings.filter ( x => x._1 != null )
result.foreach(println)

【讨论】:

    【解决方案2】:
    Ratings.filter ( x => x._1 != null ) 
    

    这实际上转换了 RDD,但你没有使用那个特定的 RDD。你可以试试

    Ratings.filter(_._1 !=null).foreach(println)
    

    【讨论】:

      【解决方案3】:

      试试下面的:

      Ratings.filter (x => x._1 != "")

      Filter rdd lines by values in fields Scala 上的类似示例

      【讨论】:

        猜你喜欢
        • 2015-06-27
        • 1970-01-01
        • 2017-06-26
        • 1970-01-01
        • 1970-01-01
        • 2015-07-10
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        相关资源
        最近更新 更多