Scala访问具有嵌套数据结构的Map [String,Any]

时间:2016-12-01 10:11:50

标签: scala classcastexception

我有简单的地图,如

  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

1 个答案:

答案 0 :(得分:3)

在RDD上收集返回一个数组。 数组不会扩展Seq。 所以你的x不能被强制转换为Seq。

例如)

Array(2).asInstanceOf[Seq[Int]]

引发同样的例外。

相反,您的结果应该是类型:Map [String,Array [Int]]

所以只需使用x.toSeq而不是x.asInstanceOf [Seq [Int]]

编辑:“你的堆栈中的[I”表示Int。

的数组

当我写这篇文章时,我想到了,我猜你正在使用的原因是因为每个你的数组都有一堆不同的参数和返回类型。如果是这种情况,那就可以看到一个稍微完整的例子。