2016-11-09 4 views
1
var myMap:Map[String, Int] = Map() 
    myRDD.foreach { data => 
     println("1. " + data.name + " : " + data.time) 
     myMap += (data.name -> data.time) 
     println("2. " + myMap) 
    } 
    println("Total Map : " + myMap) 

結果スカラ - foreachの

  1. Aにマップしてください: - :2
  2. マップ(B - > 2)
  3. B 1
  4. マップ(> 1 A) //削除された鍵A
  5. C:3
  6. マップ(C→3)//削除された鍵AおよびB

合計地図:地図()//何も

どういうわけか私はforeachの中で地図データを格納することはできません。それは新しいキー&値を追加するとき、以前のデータを削除または初期化し続けました。 これは何ですか?

答えて

1

スパーククロージャはシリアル化され、別のコンテキストで実行されます(クラスタ内ではリモート)。 myMap変数はローカルでは更新されません。

がマップとしてRDDからデータを取得するには、そこに内蔵された操作です:

val myMap = rdd.collectAsMap() 
+0

データは、クラスを持っており、その中の多くの分野があります。クラスの特定のフィールドでマップのキーと値を設定する方法。 –

+0

解決済み!元のrddを新しいrdd(キー、値)型として変換し、collectAsMap()を実行します。ありがとう:) –