spark:value histogram不是org.apache.spark.rdd.RDD的成员[Option [Any]]

时间:2017-09-10 03:32:04

标签: scala apache-spark histogram rdd

我是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]

的成员

我很困惑,在这里寻求帮助。

1 个答案:

答案 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))