火花& Scala - 无法从RDD过滤空值

时间:2016-08-03 08:56:46

标签: scala hadoop apache-spark bigdata

我试图从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)

调试时,在Filter:

之后仍然出现空值
(3359,1494,4)
(null,null,null)
(28574,1542,5)
(null,null,null)
(12062,1219,5)
(14068,1459,3)

任何更好的想法?

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

请尝试以下操作:

Ratings.filter(x => x._1!=“”)

此处类似的示例,位于Filter rdd lines by values in fields Scala