2017-08-12 10 views
1

Ich habe einen Pyspark Datenrahmen hier wie das Bild unten. Ich würde alle 2 Zeilen Gruppe wie, aber in einer Weise, dass:Pyspark - kombinieren 2 Reihen 2 eine, alle 2 Reihen

  • die erste Reihe wäre, dass Benutzer von Zeile 1 und 2 und
  • der zweiten Reihe von der Reihe wäre, 2 und 3 usw.

Etwas wie folgt aus:

---CustomerID--previous_stockcodes----stock_codes----- 

Preise und Mengen nicht verwendet werden, vorherige Korb und den aktuellen Warenkorb in ein setzen. Zum Beispiel würde die erste Zeile von CustomerID 12347 sein:

12347----[85116, 22375, 71...]-----[84625A, 84625C, ...] 

ich geschrieben habe, Schleifen, das zu tun, aber das ist wirklich ineffizient und langsam. Ich frage mich, ob ich so etwas effizient mit Pyspark machen kann, aber ich habe Schwierigkeiten, das herauszufinden. Vielen Dank im Voraus

+0

gefunden Haben Sie auf CustomerId oder nur 2 Reihen Gruppe unabhängig von customerId basierend auf GROUPBY wollen? –

+0

Ich muss sie in Trainingssatz umwandeln. Also ja nach KundenID, zB Zeile 1 und 2 von Kunde A, Zeile 2 und 3 von Kunde A etc – soulless

Antwort

1

Sie die nächste Zeile durch Verwendung lead Funktion durch Funken SQL zur Verfügung gestellt bekommen.

lead ist eine Fensterfunktion.

Syntax: Blei (column_name, int_value, default_value) über (Partition durch column_name um durch column_name)

int_value Anzahl der Zeilen führt Sie von aktuellen Zeile führen wollen.

default_value nimmt für Fall-Eingang, wenn führende Reihen nicht

>>> input_df.show() 
+----------+---------+----------------+ 
|customerID|invoiceNo| stockCode_list| 
+----------+---------+----------------+ 
|  12347| 537626| [85116, 22375]| 
|  12347| 542237|[84625A, 84625C]| 
|  12347| 549222| [22376, 22374]| 
|  12347| 556201| [23084, 23162]| 
|  12348| 539318| [84992, 22951]| 
|  12348| 541998| [21980, 21985]| 
|  12348| 548955| [23077, 23078]| 
+----------+---------+----------------+ 

>>> from pyspark.sql.window import Window 
>>> from pyspark.sql.functions import lead,col 

>>> win_func = Window.partitionBy("customerID").orderBy("invoiceNo") 
>>> new_col = lead("stockCode_list",1,None).over(win_func) 
>>> req_df = input_df.select(col("customerID"),col("invoiceNo"),col("stockCode_list"),new_col.alias("req_col")) 
>>> req_df.orderBy("customerID","invoiceNo").show() 
+----------+---------+----------------+----------------+ 
|customerID|invoiceNo| stockCode_list|   req_col| 
+----------+---------+----------------+----------------+ 
|  12347| 537626| [85116, 22375]|[84625A, 84625C]| 
|  12347| 542237|[84625A, 84625C]| [22376, 22374]| 
|  12347| 549222| [22376, 22374]| [23084, 23162]| 
|  12347| 556201| [23084, 23162]|   null| 
|  12348| 539318| [84992, 22951]| [21980, 21985]| 
|  12348| 541998| [21980, 21985]| [23077, 23078]| 
|  12348| 548955| [23077, 23078]|   null| 
+----------+---------+----------------+----------------+ 
Verwandte Themen