2015-04-28 15 views
5

ich eine Textdatei in Funken gelesen haben den BefehlIn einer Textdatei in Funken eine neue Zeile

val data = sc.textFile("/path/to/my/file/part-0000[0-4]") 

Ich möchte eine neue Zeile als Header meiner Datei hinzuzufügen. Gibt es eine Möglichkeit, dies zu tun, ohne die RDD in ein Array zu verwandeln?

Vielen Dank!

+1

Erstellen Sie neue Rdd mit 'val header = sc.parallize (Liste (" \ n "))' und fügen Sie einfach diese beiden Rdd zusammen 'header ++ data'. Aber es macht keinen Sinn, warum brauchst du es? – ipoteka

+0

Es tut mir leid, mit neuer Zeile meinte ich eine Zeile mit den Namen einiger Spalten. Mein Fehler. Wie auch immer, genau das brauche ich, danke! – amarchin

+0

Ich empfehle Ihnen dringend, sich DataFrames anzusehen. Einfach, Dataframe ist nur rdd mit einigen Meta-Informationen über Schema und Typen. Und beachten Sie, dass 'header ++ data' die Reihenfolge für große Rdds nicht beibehalten wird. – ipoteka

Antwort

-2

RDDs sind unveränderlich. Das bedeutet, dass Sie den Inhalt der einmal erstellten RDD nicht ändern können. Sie können neue RDDs von der Basis-RDD mithilfe von RDD-Transformationen erstellen.

+1

Dies ist keine wirkliche Antwort, ohne dem OP eine Vorstellung davon zu geben, wie man diese Transformationen benutzt, um zu erreichen, was er will. Es sollte ein Kommentar sein –

1

Sie können nicht wirklich kontrollieren, ob neue Zeile zuerst sein (Header) oder nicht, aber Sie können neuen Singleton RDD erstellen und mit vorhandenen verschmelzen:

val extendedData = data ++ sc.makeRDD(Seq("my precious new line")) 

so

extendedData.filter(_ startsWith "my precious").first() 

wird wahrscheinlich beweisen, dass Ihre Zeile hinzugefügt wird

+0

Sie können tatsächlich steuern, ob die neue Zeile zuerst wird. In Ihrem Beispiel wird es zuletzt sein, weil Sie es nach der ursprünglichen RDD setzen. Und was meinst du mit "wahrscheinlich"? Und Sie sprechen nicht einmal über Dateien. –

2

"Teil" -Dateien werden automatisch als Dateigruppe behandelt.

val data = sc.textFile("/path/to/my/file") // Will read all parts. 

einfach den Header hinzufügen und schreiben:

val header = sc.parallelize(Seq("...header...")) 
val withHeader = header ++ data 
withHeader.saveAsTextFile("/path/to/my/modified-file") 

Beachten Sie, dass, weil diese alle Daten lesen hat und zu schreiben, wird es als durchaus etwas langsamer sein, was Sie intuitiv erwarten. (Schließlich fügen Sie nur eine einzige neue Zeile hinzu!) Aus diesem Grund und anderen Gründen ist es besser, wenn Sie diesen Header nicht hinzufügen und stattdessen die Metadaten (Spaltenliste) getrennt von den Daten speichern.

Verwandte Themen