我是spark和scala的新手,我用scala得出了一个编译错误: 假设我们有一个rdd,就是这样的地图:
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)
编译错误说:
值histogram不是org.apache.spark.rdd.RDD的成员[Option [Any]]
我想知道为什么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不是Option [Any]
的成员
我很困惑,在这里寻求帮助。
答案 0 :(得分:2)
您获得Option
,因为Map.get
会返回一个选项;如果Map.get
中的密钥不存在,Map
将返回None;并且Option[Any]
也与Map的Value的杂项数据类型相关,你有Int和Long,在我的例子中它返回AnyVal
而不是Any
;
一个可能的解决方案是使用getOrElse
通过在密钥不存在时提供默认值来摆脱Option,并且如果您确定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))