2017-12-15 3 views
1

Gibt es eine empfohlene Methode, die folgende Art von Transformation zu tun:
Input:Wie berechnet man Start- und Endzeiten von Benutzersitzungen?

userID timestamp action 
u1  100  edit1 
u1  122  edit2 
u1  135  edit3 
u2  143  edit4 
u2  158  edit5 
u1  212  edit6 
u1  241  edit7 

Ausgang:

userID startTime endTime actions 
u1  100  135  [edit1, edit2, edit3] 
u2  143  158  [edit4, edit5] 
u1  212  241  [edit6, edit7] 

Gruppierung von Benutzer-ID Ergebnissen in den Sitzungsinformationen verloren gehen. Gleiches gilt für die Verwendung von Window-Funktionen.

EDIT für Klarheit: In diesem Fall, beachten Sie, dass Benutzer u1 erscheint 2 mal in der Ergebnismenge. Die Aktionen des Benutzers u2 unterbrechen die Aktionen von u1 in zwei Sitzungen.

+0

Dank @jaceklaskowski. Die andere Frage half. –

+0

Eine andere ähnliche Frage beantwortet: https://stackoverflow.com/questions/44020343/spark-dataframe-access-of-previous-calculated-row –

Antwort

1

Aggregate alle Spalten mit good ol‘SQL:

SELECT userID min(timestamp), max(timestamp), collect_list(actions) 
FROM df GROUP BY userID 

oder Dataset API:

df.groupBy("userID").agg(
    min("timestamp") as "startTime", 
    max("timestamp") as "endTime", 
    collect_list("actions") as "actions") 
+0

Leider würde das in den folgenden Zeilen führen: '[(u1 100 241 [edit1, edit2, edit3, edit6, edit7]), (u2 143 158 [edit4, edit5])] ' und würden keine separaten Sitzungen für denselben Benutzer aufrechterhalten. u1 muss 2 Zeilen haben, die die zwei Sitzungen darstellen. –

Verwandte Themen