2016-05-11 2 views
-1

Ich versuche, eine Liste von Zeichenfolgen aus dem Header einer CSV-Datei in pyspark zu bilden. Der Header in der CSV-Datei ist im Unicode-Format. Ich schrieb diesen Code, der den Header liest, aber es nicht mit einzelnen Werten aus dem Header der Liste bildet:bilden eine Liste von Zeichenfolgen aus dem Header einer CSV-Datei in pyspark

def filter(line): 

    return line 

read_file = sc.textFile('file:///file1.csv').zipWithIndex().filter(lambda (line, rownum): rownum == 0).map(lambda (line, rownum): line) 


data = (read_file 
     .map(lambda line: line.split(",")) 
     .filter(lambda line: len(line) >= 1) 
     .map(filter)) 

print data.collect() 

Der Ausgang Ich sehe wie folgt aussieht:

[[u'header1', u'header2', u'header3', u'header4', u'header5']] 

während ich möchte es sei ['header1','header2','header3','header4','header5']

Wie kann ich es korrigieren und die Liste bilden?

+1

Fügen Sie einfach ein '[0]' ganz am Ende Ihres Codes hinzu. Mach dir keine Sorgen um das "Du", es ist harmlos. Es bedeutet, dass es ein Unicode-Objekt und keine einfache Zeichenfolge ist, was eigentlich eine gute Sache ist. Wenn Sie 'header in data.collect(): print header' versuchen, sehen Sie nur die Header :-) –

+0

@AlexHall Wo soll ich '[0]' einfügen? – user2966197

+0

Was Sie sehen, ist eine Liste mit einem Element: eine Liste. Sie können dieses eine Element mit '[0]' extrahieren, zB 'print data.collect() [0]' oder 'für den Header in data.collect() [0]: print header' (Ich habe es im obigen Kommentar vergessen). –

Antwort

1

Einfach genug, Ihr Problem zu beheben: flatMap nur anstelle von map

data = read_file.flatMap(lambda l: l.split(",")) 

Offensichtlich [0] des Ergebnisses wie in data.collect()[0] nehmen ist auch eine Lösung.

Wie Sie es gerade tun, iterieren Sie jedoch über die ganze Datei, um alle Zeilen außer der ersten zu verwerfen. Ich würde empfehlen, .take(1) auf der RDD zu verwenden.

first_line = sc.textFile('test.csv').take(1) 
first_line[0].split(",") 

Diese zweite Lösung ist viel schneller auf langen Dateien.

Beachten Sie auch, dass Ihre Filterfunktion derzeit keinen Zweck erfüllt, Sie könnten einfach .map(filter) auslassen.

Verwandte Themen