我试图从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)
任何更好的想法?
答案 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)