Scala 访问具有嵌套数据结构的 Map[String, Any]
Scala access Map[String, Any] with nested data structures
我有一张像
这样的简单地图
val parameters: Map[String, Any] = Map("digits" -> Seq(1, 2, 3, 4, 5, 6, 7, 8,
想要将每个数字乘以 3,如下所示
class PrintMap extends App {
val conf: SparkConf = new SparkConf()
.setAppName("sparkApiSample")
.setMaster("local[*]")
val session: SparkSession = SparkSession
.builder()
.config(conf)
.getOrCreate()
val parameters: Map[String, Any] = Map("digits" -> Seq(1, 2, 3, 4, 5, 6, 7, 8, 9, 0))
val numbers: Seq[Int] = parameters("digits").asInstanceOf[Seq[Int]]
val rdd = session.sparkContext.parallelize(numbers)
val result = Map("result" -> rdd.map(x => x * 3).collect())
// want to "access / print the contents of the Array at result
result.get("result") match {
case Some(x) => x.asInstanceOf[Seq[Any]].foreach(println)
case None => println("error occurred")
}
为什么会导致以下异常,我如何才能真正访问地图? java.lang.ClassCastException: [I cannot be cast to scala.collection.Seq
收集一个 RDD returns 一个数组。
Array 不扩展 Seq。
所以你的 x 不能转换为 Seq.
例)
Array(2).asInstanceOf[Seq[Int]]
抛出相同的异常。
相反,您的结果应为以下类型:Map[String, Array[Int]]
所以只用 x.toSeq 代替 x.asInstanceOf[Seq[Int]]
编辑:堆栈中的“[I”表示 Int 数组。
我在写这篇文章时突然想到,我猜你使用 any 的原因是因为每个参数都有一堆不同的参数和数组中的 return 类型。如果是这种情况,查看稍微更完整的示例会很方便。
我有一张像
这样的简单地图 val parameters: Map[String, Any] = Map("digits" -> Seq(1, 2, 3, 4, 5, 6, 7, 8,
想要将每个数字乘以 3,如下所示
class PrintMap extends App {
val conf: SparkConf = new SparkConf()
.setAppName("sparkApiSample")
.setMaster("local[*]")
val session: SparkSession = SparkSession
.builder()
.config(conf)
.getOrCreate()
val parameters: Map[String, Any] = Map("digits" -> Seq(1, 2, 3, 4, 5, 6, 7, 8, 9, 0))
val numbers: Seq[Int] = parameters("digits").asInstanceOf[Seq[Int]]
val rdd = session.sparkContext.parallelize(numbers)
val result = Map("result" -> rdd.map(x => x * 3).collect())
// want to "access / print the contents of the Array at result
result.get("result") match {
case Some(x) => x.asInstanceOf[Seq[Any]].foreach(println)
case None => println("error occurred")
}
为什么会导致以下异常,我如何才能真正访问地图? java.lang.ClassCastException: [I cannot be cast to scala.collection.Seq
收集一个 RDD returns 一个数组。 Array 不扩展 Seq。 所以你的 x 不能转换为 Seq.
例)
Array(2).asInstanceOf[Seq[Int]]
抛出相同的异常。
相反,您的结果应为以下类型:Map[String, Array[Int]]
所以只用 x.toSeq 代替 x.asInstanceOf[Seq[Int]]
编辑:堆栈中的“[I”表示 Int 数组。
我在写这篇文章时突然想到,我猜你使用 any 的原因是因为每个参数都有一堆不同的参数和数组中的 return 类型。如果是这种情况,查看稍微更完整的示例会很方便。