spark:值直方图不是 org.apache.spark.rdd.RDD[Option[Any]] 的成员
Posted
技术标签:
【中文标题】spark:值直方图不是 org.apache.spark.rdd.RDD[Option[Any]] 的成员【英文标题】:spark: value histogram is not a member of org.apache.spark.rdd.RDD[Option[Any]] 【发布时间】:2017-09-10 03:32:04 【问题描述】:我是 spark 和 scala 的新手,但我遇到了 scala 的编译错误: 假设我们有一个 rdd,它是这样的地图:
val rawData = someRDD.map
//some ops
Map(
"A" -> someInt_var1 //Int
"B" -> someInt_var2 //Int
"C" -> somelong_var //Long
)
然后,我想获取这些变量的直方图信息。所以,这是我的代码:
rawData.maprow => row.get("A").histogram(10)
编译错误提示:
值直方图不是 org.apache.spark.rdd.RDD[Option[Any]] 的成员
我想知道为什么 rawData.maprow => row.get("A")
是 org.apache.spark.rdd.RDD[Option[Any]]
以及如何将其转换为 rdd[Int]?
我试过这样:
rawData.maprow => row.get("A").map_.toInt.histogram(10)
但是编译失败:
值 toInt 不是 Option[Any] 的成员
我很困惑,在这里寻求帮助。
【问题讨论】:
【参考方案1】:你得到Option
因为Map.get
返回一个选项;如果Map
中不存在密钥,Map.get
返回 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))
【讨论】:
以上是关于spark:值直方图不是 org.apache.spark.rdd.RDD[Option[Any]] 的成员的主要内容,如果未能解决你的问题,请参考以下文章