2016-08-16 4 views
1

Ich habe eine RDD name berechtigt.Scala RDD String-Manipulation

scala> name 
res6: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[24] at map at <console>:37 

Ich kann es inspizieren name.foreach(println)

name5000005125651330 
name5000005125651331 
name5000005125651332 
name5000005125651333 

ich mit einem neuen RDD erstellen möchte, die die name Zeichen vom Anfang jeden Datensatz entfernt und gibt die restlichen Zahlen in long Format.

Gewünschtes Ergebnis:

5000005125651330 
5000005125651331 
5000005125651332 
5000005125651333 

Ich habe versucht, die folgenden:

val name_clean = name.filter(_ != "name") 

Doch diese zurück:

name5000005125651330 
name5000005125651331 
name5000005125651332 
name5000005125651333 
+0

„Doch diese gibt“ natürlich auch da ist jede Zeile nicht gleich „name“ So etwas wie. 'name.map (_. fallen (4) .toLong)' sollte es tun (das fällt nur die ersten vier charact bedingungslos überprüft es nicht, dass es sich um eine –

+0

Danke Paul. Das habe ich nicht bemerkt. Hat funktioniert! Fühlen Sie sich frei, als Antwort zu posten – LearningSlowly

Antwort

4

Jeder Eintrag in der RDD eine Zeichenfolge ist. So einen Vergleich mit „name“ wird immer fehlschlagen, wie es ist „name“ + einige Ziffern.

Was Sie brauchen, ist map über die RDD iterieren und einen neuen Wert für jeden Eintrag zurückzukehren. Und dieser neue Wert sollte die Zeichenfolge, ohne die ersten 4 Zeichen und konvertiert Long.

Putting, dass alle zusammen, wir

name.map(_.drop(4).toLong) 

bekommen Wenn Sie nicht wissen, die ersten vier Zeichen wird „name“ sein, könnten Sie diese zuerst überprüfen möchten. Was Sie brauchen, hängt dann davon ab, was Sie mit Reihen tun wollen, die keinen Namen wie die ersten vier, aber so etwas wie

name.filter(_.startsWith("name")).map(_.drop(4).toLong) 
2

Verfahren stripPrefix wird einen gegebenen Präfix aus einem String entfernen (und nichts tun, wenn die Zeichenfolge nicht mit diesem Präfix startet

So erreichen Sie, was Sie brauchen von:.

val name_clean = name.map(_.stripPrefix("name").toLong) 
+0

Nur das OP weiß sicher, aber es scheint unwahrscheinlich, dass, wenn die ersten vier Zeichen nicht "Name" sind, dann werden sie Ziffern sein. Wenn die Datei also nur Zeilen enthält, die "name" beginnen, funktioniert das (aber Sie können auch einfach nur vier Zeichen löschen). Wenn einige Zeilen "name" nicht starten, wird wahrscheinlich ein Fehler ausgegeben. –

+0

Wahr. Aber je nach Kontext, könnte man einen Laufzeitfehler lieber leise schlechte Einträge zu ignorieren. Wenn Stille ignoriert werden soll, können wir '.filter (_. StartsWith (" name "))' genau wie in Ihrer Antwort einfügen. –

+0

Entschuldigung. Nein. Ihr Code wird vielleicht nur eine Ausnahme geben, abhängig davon, ob die fehlerhafte Zeile nur Ziffern enthält oder nicht. Kann oder darf keine Ausnahme bei schlechter Eingabe geben, ist nicht gut –

Verwandte Themen