2016-12-01 12 views
1

私はScalaのアクセスマップ[文字列、任意]

val parameters: Map[String, Any] = Map("digits" -> Seq(1, 2, 3, 4, 5, 6, 7, 8, 

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") 
    } 

なぜそれが結果ん、以下に示すように3で各番号を掛けたいようなのシンプルなマップを持っています次の例外と私は実際にマップにアクセスすることができますか? java.lang.ClassCastException: [I cannot be cast to scala.collection.Seq

+0

安全でないコード - > asInstanceOfを使用しています。タイプとのパターンマッチングを試してください:http://stackoverflow.com/questions/15655817/scala-multiple-type-pattern-matching – Pavel

+0

@Pavelしかし、どのタイプが[I @ ...? –

+0

どういう意味ですか?安全でないコードを使用しています。メソッド/コードを追加して安全な方法で実行します。 – Pavel

答えて

3

RDDで収集すると配列が返されます。 アレイはSeqを拡張しません。 あなたのxはSeqにキャストできません。

など。)

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

は同じ例外をスローします。

代わりに、あなたの結果は型でなければなりません:地図[文字列、配列[INT]]

だからではなく、ただx.asInstanceOf [配列[INT]]

EDITのx.toSeqのisnteadを使用します。 " [私はあなたのスタックでIntの配列を意味します。

私がこれを書いていたとき、私はあなたが何らかの理由で使用していると推測しています。なぜなら、あなたのアレイにはさまざまなパラメータと戻り値の型があるからです。これが当てはまる場合は、もう少し完全な例を見てください。

+0

Thanks 'result.get( "result")。toSeq.asInstanceOf [List [Array [Int]]]。flatten.foreach(println) 'はうまく動作します。 –

+2

あなたはそれが働いているのを見てうれしい。しかし正直なところ、あなたのキャスティングがこれほど多くの場合、あなたはおそらく何かをしている ' –

関連する問題