2016-08-03 5 views
3

RDDからヌル値をフィルタリングしようとしましたが失敗しました。ここに私のコードは次のとおりです。Spark&Scala - 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) 

デバッグは、NULL値がまだフィルターの後に登場したとき:

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

任意のより良いアイデア?

+1

あなたは間違っている。 Ratings.filter(x => x._1!= null).foreach(println)は、 – Knight71

+0

の 'val filteredRatings = Ratings.filter(x => x._1!= null)'と 'filteredRatings.foreach(println)'を実行します。 。 –

答えて

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

を、これは実際にRDDを変換しますが、あなたはそうではありませんその特定のRDDを使用します。あなたが間違っているとしようとすることができます

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

RDDは、変更不可能なオブジェクトです.RDD上の変換によって元のRDDは変更されず、新しいRDDが生成されます。だから、 - あなたはRDDを使用する必要がありますが、filterの効果を確認したい場合は(ちょうどあなたがmapの結果をどうのように)filterから返さ:

val result = Ratings.filter (x => x._1 != null) 
result.foreach(println) 
関連する問題