2017-05-17 4 views
0
Spark basiert auf regex Neuzuweisung

enter image description hereFiltern und

Ich habe einen Funken DataFrame namens df, wie oben im Bild gezeigt. Es gibt eine Spalte mit dem Namen region, die derzeit nur den Wert NE hat. Es gibt eine separate Spalte namens address mit vielen Adressen. Ich möchte die Beobachtungen von region zu VA ändern, wobei address mit VA endet. Wie kann ich das machen? Entweder funktionieren pyspark oder sparkr Befehle.

+0

Kasse [ 'endswith'] (https://spark.apache.org/docs/1.6.2/api/python/pyspark.sql.html#pyspark.sql.Column.endswith) Betreiber von' pysparks.sql.functions' – muon

Antwort

1

das folgende Snippet sollte funktionieren. Diese Methode konvertiert den Datenrahmen in RDD und führt eine Zuordnungsoperation durch, um den Bereich entsprechend zu ändern.

>>> df = sc.parallelize([("NE","NE"), ("Luray, VA", "NE"), ("VA" ,"NE"), ("Richmond, VA", "NE")]).toDF(["address", "region"]) 
>>> df.rdd.map(lambda (x,y): (x,'VA' if x.endswith('VA') else y)).toDF(["address", "region"]).show() 
+------------+------+ 
|  address|region| 
+------------+------+ 
|   NE| NE| 
| Luray, VA| VA| 
|   VA| VA| 
|Richmond, VA| VA| 
+------------+------+ 

der Ansatz ohne Konvertieren von Datenrahmen zu RDD würde wie folgt aussehen. Hinweis: Dieser Ansatz ist dem rdd-Ansatz vorzuziehen, da er leistungsfähiger ist und weniger Annahmen über das Schema enthält.

from pyspark.sql.functions import udf 
df = sc.parallelize([("NE","NE"), ("Luray, VA", "NE"), ("VA" ,"NE"), ("Richmond, VA", "NE")]).toDF(["address", "region"]) 
regionfunc = udf(lambda x: 'VA' if x.endswith('VA') else x) 
df.withColumn('region', regionfunc(df.address)).show() 

+------------+------+ 
|  address|region| 
+------------+------+ 
|   NE| NE| 
| Luray, VA| VA| 
|   VA| VA| 
|Richmond, VA| VA| 
+------------+------+ 
+0

Würde das funktionieren, selbst wenn es im 'DataFrame' mehr Spalten als 2 gibt? –

+0

ja würde es aber die map lamba funktion muss geändert werden. alternativ können Sie mit Column Option das Dataframe definiert .. –

+0

@GauravBansal aktualisiert die Antwort, die Datenframes verwendet und sollte für eine beliebige Anzahl von Spalten arbeiten .. –