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) 

ErgebnisScala - Halten Karte in foreach

  1. A: 1
  2. Karte (A -> 1)
  3. B: 2
  4. Karte (B -> 2) // gelöschter Schlüssel A
  5. C: 3
  6. Karte (C -> 3) // gelöscht Schlüssel A und B

Gesamt Karte: Karte() // nichts

Irgendwie kann ich nicht Kartendaten in foreach speichern. Es löschte oder löschte vorherige Daten beim Hinzufügen des neuen Schlüssels & Wert. Irgendeine Idee davon?

Antwort

1

Spark-Verschlüsse werden serialisiert und in einem separaten Kontext ausgeführt (remote in einem Cluster). myMap Variable wird nicht lokal aktualisiert.

Um die Daten aus der RDD als eine Karte zu bekommen, gibt es einen eingebauten in Betrieb:

val myMap = rdd.collectAsMap() 
+0

Daten haben Klasse und es gibt darin viele Felder. So legen Sie den Schlüssel und Wert der Karte mit einem bestimmten Klassenfeld fest. –

+0

Gelöst! Übersetze den Ursprung rdd als neuen rdd (Schlüssel, Wert) Typ und mache collectAsMap(). Vielen Dank :) –