2017-09-10 37 views
1

我是新来的spark和scala,我想出了scala编译错误: 让我们说我们有一个rdd,这是一个这样的地图:spark:值直方图不是org.apache.spark.rdd.RDD的成员[Option [Any]]

val rawData = someRDD.map{ 
    //some ops 
    Map(
    "A" -> someInt_var1 //Int 
    "B" -> someInt_var2 //Int 
    "C" -> somelong_var //Long 
    ) 
} 

然后,我想要得到这些变量的直方图信息。所以,这里是我的代码:

rawData.map{row => row.get("A")}.histogram(10) 

而且编译错误说:

值直方图不org.apache.spark.rdd.RDD [选项[任何]

成员

我不知道为什么rawData.map{row => row.get("A")}org.apache.spark.rdd.RDD[Option[Any]]以及如何改造它RDD [INT]? 我已经试过这样:

rawData.map{row => row.get("A")}.map{_.toInt}.histogram(10) 

但它编译失败:

值toInt不是选项中的一员[任何]

我完全糊涂了,寻求帮助这里。

回答

2

你得到Option,因为Map.get返回一个选项;如果在Map中不存在密钥,则Map.get返回无;并且Option[Any]也与Map的Value的其他数据类型有关,你有Int和Long,在我的情况下它返回AnyVal而不是Any;

一个可能的解决方案是使用getOrElse通过提供当键不存在,默认值摆脱的选项,如果你确信A的价值始终是一个INT,可以从AnyVal将其转换为Int使用asInstanceOf[Int];

简化示例如下:

val rawData = sc.parallelize(Seq(Map("A" -> 1, "B" -> 2, "C" -> 4L))) 

rawData.map(_.get("A")) 
// res6: org.apache.spark.rdd.RDD[Option[AnyVal]] = MapPartitionsRDD[9] at map at <console>:27 

rawData.map(_.getOrElse("A", 0).asInstanceOf[Int]).histogram(10) 
// res7: (Array[Double], Array[Long]) = (Array(1.0, 1.0),Array(1)) 
相关问题