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,您可以将其从AnyValInt 使用 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]] 的成员的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Spark 结构化流数据写入 REST API?

使用java将oracle数据库连接到apache spark时出错

在 Spark 中创建分箱直方图

如何将 pyspark-dataframe 写入红移?

如何仅从直方图值创建 KDE?

Spark 错误 - 值文本文件不是 org.apache.spark.sparkcontext 的成员