2016-10-06 7 views
0

ich in diesem Format ein PySpark Datenrahmen haben:Breaking down Reihen in Pyspark Datenrahmen

dbn  |  bus  | subway | score 
----------|----------------|----------|-------- 
XYZ12  | B1, B44, B66 | A, C  | 59 
ZYY3  | B8, B3, B7  | J, Z  | 66 

Was ich will, ist zu tun in der Lage die Partitur Spalte für jeden einzelnen Bus- und U-Bahnlinie zu befestigen, jedoch möchte ich arbeite auf einer Spalte nach der anderen, also fange ich mit dem Bus an. Letzten Endes, was ich meine Datenrahmen aussehen wollen, ist dies

dbn  | bus  | subway | score 
---------|-----------|---------|------- 
XYZ12 | B1  | A, C | 59 
XYZ12 | B44  | A, C | 59 
XYZ12 | B66  | A, C | 59 
ZYY3  | B8  | J, Z | 66 
ZYY3  | B3  | J, Z | 66 
ZYY3  | B7  | J, Z | 66 

Wie würde ich über das tun dies gehen (wenn ich mit dem Bus Spalte gerade arbeite)?

Antwort

0

Sie können explode Funktion, die eine array oder map Spalte als Eingabe erwartet. Wenn bus eine Zeichenkette ist, können Sie Zeichenkettenfunktionen wie split verwenden, um sie zuerst in Stücke zu zerlegen. Lassen Sie uns dieses Szenario übernehmen:

df = sc.parallelize([ 
    ("XYZ12", "B1, B44, B66", "A, C", 59), 
    ("ZYY3 ", "B8, B3, B7", "J, Z", 66) 
]).toDF(["dbn", "bus", "subway", "score"]) 

Ersteinfuhr erforderlichen Funktionen:

from pyspark.sql.functions import col, explode, split, trim 

hinzufügen Säule:

with_bus_exploded = df.withColumn("bus", explode(split("bus", ","))) 

und trim führende/nachfolgende Leerzeichen:

with_bus_trimmed = with_bus_exploded.withColumn("bus", trim(col("bus"))) 

Schließlich wird die Ergebnis i s:

+-----+---+------+-----+ 
| dbn|bus|subway|score| 
+-----+---+------+-----+ 
|XYZ12| B1| A, C| 59| 
|XYZ12|B44| A, C| 59| 
|XYZ12|B66| A, C| 59| 
|ZYY3 | B8| J, Z| 66| 
|ZYY3 | B3| J, Z| 66| 
|ZYY3 | B7| J, Z| 66| 
+-----+---+------+-----+