0

Ich habe zwei Array-Felder in einem Datenrahmen.Vergleichen von zwei Arrays und erhalten den Unterschied in PySpark

enter image description here

Ich habe eine Verpflichtung, diese zwei Felder zu vergleichen und die Differenz als einen Array (neue Spalte) in dem gleichen Datenrahmen zu erhalten.

Erwarteter Ausgang ist:

enter image description here

Spalte B eine Teilmenge der Spalte A ist auch die Worte in der gleichen Reihenfolge in beiden Arrays sein wird.

Kann mir bitte jemand helfen, eine Lösung dafür zu bekommen?

Antwort

1

Sie können eine benutzerdefinierte Funktion verwenden. Mein Beispiel Datenrahmen unterscheidet sich ein wenig von Ihnen, aber der Code sollte funktionieren:

import pandas as pd 
from pyspark.sql.types import * 

#example df 
df=sqlContext.createDataFrame(pd.DataFrame(data=[[["hello", "world"], 
["world"]],[["sample", "overflow", "text"], ["sample", "text"]]], columns=["A", "B"])) 

# define udf 
differencer=udf(lambda x,y: list(set(x)-set(y)), ArrayType(StringType())) 
df=df.withColumn('difference', differencer('A', 'B')) 

EDIT:

Dies funktioniert nicht, wenn es Duplikate sind als Set nur uniques behält. So können Sie die UDF wie folgt ändern:

differencer=udf(lambda x,y: [elt for elt in x if elt not in y]), ArrayType(StringType())) 
+0

Dank einer Tonne ags29..It war wie ein Zauber funktioniert :-) nur ein Zweifel, entfernt es die Duplikate too..Is es eine Möglichkeit, alle Werte zu halten ? – Joe

+0

good point, ich habe die udf geändert – ags29

+0

Nochmals vielen Dank ... Es behält die Duplikate jetzt .. :-) Ich musste eine Liste in den Befehl hinzufügen, die ich glaube, Sie vergessen zu ergänzen ... differencer = udf (lambda x, y: Liste ([elt für elt in x wenn elt nicht in y]), ArrayType (StringType())) – Joe

Verwandte Themen