2016-05-12 10 views
0

ich folgenden Datenrahmen habe (Wert in Array sind Strings):Spark-Dataframes: Liste in einer neuen Spalte anhängt (Python)

+--------------------+--------------------+ 
|    col1|    col2| 
+--------------------+--------------------+ 
| [value1, value2]|  [value3,value4]| 
|   [value5]|   [value6]| 
+--------------------+--------------------+ 

Wie kann ich eine neue Spalte mit einem neuen Array zu erstellen einschließlich aller beide Werte von

+--------------------+--------------------+------------------------------+ 
|    col1|    col2|       new | 
+--------------------+--------------------+------------------------------+ 
| [value1, value2]|  [value3,value4]|[value1, value2,value3,value4]| 
|   [value5]|   [value6]|    [value5,value6]| 
+--------------------+--------------------+------------------------------+ 

habe ich versucht, die folgenden:

def add_function(col1,col2): 
    return col1+col2 

udf_add = udf(add_function,ArrayType(StringType())) 
dftrial.withColumn("new",udf_add("col1","col2")).show(2) 

es die Aufgabe macht, wie gewünscht. Aber ich verstehe nicht, warum, wenn ich den add_function ändern:

def add_function(col1,col2): 
    return col1.extend(col2) 

Es gibt null Wert. Warum?

Und meine Hauptfrage: Gibt es eine andere Möglichkeit, diese Aufgabe zu implementieren, Any bereits implementierte Funktion? Ich fand concat, aber es scheint, dass es nur für Strings funktioniert.

Antwort

1

Warum nicht? Python Typ Hinweise list.extend ist:

list.extend(iterable) -> None 

Sie genau so erhalten, was von extend zurückgegeben. Wenn Sie die Änderung der Sammlung zurückgeben möchten, sollten Sie eigentlich col1 zurückgeben, aber bitte nicht, weil es hier tatsächlich einen schlechteren Teil gibt.

Sie sollten nie Daten bei der Arbeit mit Spark in Ort ändern. Während Sie in diesem speziellen Szenario sicher sind, kann es unvorhersehbare Konsequenzen haben. Sie können ein mögliches Beispiel in meiner Antwort auf Will there be any scenario, where Spark RDD's fail to satisfy immutability.? finden. Während PySpark von solchen Verhaltensweisen relativ isoliert ist, ist es nur ein Implementierungsdetail und nicht etwas, auf das Sie sich im Allgemeinen verlassen können.

+0

Danke für Ihre Antwort. Kannst du erklären, was ich niemals tun sollte? Weil ich es nicht genau verstanden habe und es scheint eine wichtige Information zu sein, die ich vermisse. –

+1

'list.extend' modifiziert (mutiert) existierende' liste'. Tun Sie dies nicht mit Ihren Daten. Geben Sie immer ein neues Objekt zurück, es sei denn, dies ist explizit erlaubt (siehe 'RDD.fold',' RDD.aggregate', etc.) – zero323

0

Ich stimme @ Zero323 zu. Ich wollte nur die Transformation hinzufügen, die nötig wäre, um die Lösung in einen neuen Datenrahmen zu bringen.

val updatedDataframe = initialDataframe.map { 
    case Row(col1: Seq[String], col2: Seq[String]) => (col1, col2, col1.union(col2)) 
    }.toDF("col1", "col2", "col3") 
Verwandte Themen