2016-07-28 5 views
0

In PySpark können wir nicht die traditionelle Pandas oder R-Stil-Notation verwenden, um neue Spalten basierend auf alten in einem DataFrame zu erstellen. Zum Beispiel, sagen, dass ich versuchen, zwei Spalten verketten:In PySpark DataFrames, warum ist __setitem__ nicht vollständig implementiert?

import pyspark.sql.functions as F 
df['newcol'] = F.concat(df['col_1'], df['col_2']) 

Ergebnis:

TypeError: 'DataFrame' object does not support item assignment 

Stattdessen die implementierte Methode, dies zu tun, ist

df = df.withColumn('newcol', F.concat(df['col_1'], df['col_2'])) 

Gibt es einen Grund PySpark nicht Implementieren Sie die traditionelle DataFrame-Notation?

Antwort

1

Sie können mehrere Gründe finden, um diesen Weg sowie einige Gegenbeispiele (SparkR API) zu implementieren, aber es wird argumentieren, dass grundlegender Grund ist die Umsetzung Reinheit.

Im Gegensatz zu R oder Pandas Datenrahmen Spark DataFrame ist eine unveränderliche Datenstruktur. Jede Änderung des Schemas erzeugt ein komplett neues DataFrame, so dass jede Operation, die sonst vorschlagen würde, einfach irreführend wäre.

Theoretisch könnte man mit der Umsetzung __setitem__ durch Ersetzen eines Verweises auf JVM DataFrame weg, aber wenn man bedenkt, dass die Identität eines DataFrame ziemlich definitiv von _jdf ist, würde dies ganz unpythonic sein.

+0

Ich denke, ich verstehe. Mit anderen Worten, traditionelle Datenrahmen sind veränderbare Objekte (Listen von Vektoren), während Spark DataFrames unveränderlich sind, da Spark innerhalb eines funktionalen Programmiermodells entworfen ist. "__setitem__" ist eine Mutation und nicht anwendbar auf ein unveränderliches Objekt. – Paul

+0

Ja, genau ... Sie könnten es selbst und Affe Patch implementieren, aber es würde fischig riechen. – zero323

Verwandte Themen