2016-06-20 14 views
1

Ich habe einen Datenrahmen, der wie folgt aussieht:Wie kann ich einer Zeile in pyspark einen Wert hinzufügen?

preds.take(1) 
[Row(_1=0, _2=Row(val1=False, val2=1, val3='high_school'))] 

Ich mag das Ganze eine Zeile sein, ohne die verschachtelten Reihe drin. Der erste Wert würde also einen Namen erhalten und Teil des einreihigen Objekts sein. Wenn ich es „ID“ nennen wollte, würde es so aussehen:

preds.take(1) 
[Row(ID=0, val1=False, val2=1, val3='high_school')] 

ich verschiedene Dinge innerhalb einer Karte habe versucht, aber nichts produziert, was ich suche (oder Fehler bekommen). Ich habe versucht:

preds.map(lambda point: (point._1, point._2)) 
preds.map(lambda point: point._2.append(point._1)) 
preds.map(lambda point: point._2['ID']=point._1) 
preds.map(lambda point: (point._2).ID=point._1) 

Antwort

1

Seit ist ein tuple und tuples unveränderlich sind, können Sie nur ein neues Objekt erstellen. Mit Klar Tupeln:

from pyspark.sql import Row 

r = Row(_1=0, _2=Row(val1=False, val2=1, val3='high_school')) 
r[:1] + r[1] 
## (0, False, 1, 'high_school') 

oder Konservieren __fields__:

Row(*r.__fields__[:1] + r[1].__fields__)(*r[:1] + r[1]) 
## Row(_1=0, val1=False, val2=1, val3='high_school') 

In der Praxis direkt auf Zeilen betrieben werden, sollten sollte ohne Abrufen von Daten zu Python-Interpreter für den Einsatz von DataFrame DSL vermieden werden:

df = sc.parallelize([r]).toDF() 

df.select("_1", "_2.val1", "_2.val2", "_2.val3") 
+0

Die letzte Option ist in meinem Fall am sinnvollsten. Ich wusste nicht, dass ich es vermeiden sollte, in den Reihen selbst zu arbeiten, aber das macht Sinn. Vielen Dank! – lilyrobin

Verwandte Themen