2016-08-03 38 views
3

Ich habe versucht, Null-Werte von RDD zu filtern, aber fehlgeschlagen. Hier ist mein Code:Spark & ​​Scala - Kann nicht null filtern Werte von 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) 

beim Debuggen, noch Nullwert erschien nach Filter:

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

jede bessere Idee?

+1

Sie tun es falsch. Ratings.filter (x => x._1! = Null) .foreach (println) funktioniert – Knight71

+0

'val filteredRatings = Ratings.filter (x => x._1! = Null)' und 'filteredRatings.foreach (println)' . –

Antwort

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

dies tatsächlich verwandelt die RDD, aber sie sind nicht Verwenden dieser bestimmten RDD. U kann versuchen

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

RDDs sind unveränderliche Objekte - jede Umwandlung auf einer RDD ändert diese ursprüngliche RDD nicht, sondern erzeugt eine neue. Also - sollten Sie die RDD verwenden aus filter zurückgegeben (wie Sie mit dem Ergebnis von map tun), wenn Sie die Wirkung von filter sehen wollen:

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