首页 文章

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

提问于
浏览
1

我是spark和scala的新手,我用scala得出了一个编译错误:假设我们有一个rdd,这是一个这样的 Map :

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)

并且编译错误说:

value 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 回答

  • 2

    你得到 Option 因为 Map.get 返回一个选项;如果 Map 中不存在该键, Map.get 将返回None;并且 Option[Any] 也与Map的Value的杂项数据类型有关,你有Int和Long,在我的例子中它返回 AnyVal 而不是 Any ;

    一个可能的解决方案是使用 getOrElse 通过提供当键不存在,默认值摆脱的选项,如果你确信 A 的 Value 始终是一个INT,可以将它从 AnyVal 转换使用 asInstanceOf[Int]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))
    

相关问题