2015-04-28 16 views
5

Czytałem plik tekstowy w Spark używając poleceniaDodaj nową linię do pliku tekstowego w Spark

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

Chciałbym dodać nową linię w nagłówku mojego pliku. Czy jest jakiś sposób, aby to zrobić bez przekształcania RDD w Array?

Dziękujemy!

+1

Utwórz nowy Rdd z 'val header = sc.parallize (List (" \ n "))) i po prostu dodaj te dwa Rdd razem' header ++ data'. Ale to nie ma sensu, dlaczego tego potrzebujesz? – ipoteka

+0

Przykro mi, w nowej linii miałem na myśli linię z nazwami niektórych kolumn. Mój błąd. W każdym razie to jest dokładnie to, czego potrzebuję, dziękuję! – amarchin

+0

Gorąco polecam spojrzenie na DataFrames. Po prostu, ramka danych jest po prostu rdd z pewnymi meta-informacjami o schemacie i typach. I pamiętaj, że 'header ++ data' nie będzie zachowywał porządku dla dużych Rdd. – ipoteka

Odpowiedz

-2

RDD są niezmienne. Oznacza to, że po utworzeniu nie będzie można zmienić zawartości RDD. Możesz utworzyć nowy RDD z podstawowego RDD za pomocą transformacji RDD.

+1

To nie jest odpowiedź, nie dając OP koncepcji, jak wykorzystać te transformacje, aby osiągnąć to, co chce. Powinien to być komentarz –

1

Nie można właściwie kontrolować, czy nowa linia będzie pierwszym (nagłówek), czy nie, ale można tworzyć nowe singleton RDD i połączyć go z istniejącej:

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

tak

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

będzie prawdopodobnie udowodnisz, że twoja linia jest dodana

+0

Możesz faktycznie kontrolować, czy nowa linia będzie pierwsza. W twoim przykładzie będzie on ostatni, ponieważ umieścisz go po pierwotnym RDD. A co masz na myśli "prawdopodobnie"? I nawet nie rozmawiasz o plikach. –

2

Pliki "części" są automatycznie traktowane jako zbiór plików.

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

Wystarczy dodać nagłówek i napisać go:

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

Zauważ, że to musi odczytywać i zapisywać wszystkie dane, to będzie trochę wolniej niż to, co można intuicyjnie spodziewać. (W końcu dodajesz tylko jedną nową linię!) Z tego i innych powodów lepiej nie dodawać tego nagłówka, a zamiast tego przechowywać metadane (listę kolumn) oddzielnie od danych.

Powiązane problemy