anu*_*der 3 hadoop scala bigdata apache-spark
我试图从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)
Run Code Online (Sandbox Code Playgroud)
调试时,过滤后仍然出现空值:
(3359,1494,4)
(null,null,null)
(28574,1542,5)
(null,null,null)
(12062,1219,5)
(14068,1459,3)
Run Code Online (Sandbox Code Playgroud)
有什么好主意吗?
RDD是不可变的对象-RDD上的任何转换都不会更改原始RDD,而是会产生一个新的RDD。因此- 如果您想查看的效果,则应使用从返回的RDD filter
(就像对的结果一样map
)filter
:
val result = Ratings.filter ( x => x._1 != null )
result.foreach(println)
Run Code Online (Sandbox Code Playgroud)
Ratings.filter ( x => x._1 != null )
Run Code Online (Sandbox Code Playgroud)
这实际上转换了RDD,但你没有使用那个特定的RDD.你可以试试
Ratings.filter(_._1 !=null).foreach(println)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7632 次 |
最近记录: |