2017-12-15 27 views
1

は、変換の次のタイプを行うための推奨方法はあります:
入力:ユーザーセッションの開始時刻と終了時刻を計算する方法は?

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

出力:失われたセッション情報でユーザーIDの結果によってグループ化

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

。 Window関数を使用する場合と同じです。

明快に編集: この場合、ユーザーu1は結果セットに2回表示されます。ユーザーu2のアクションは、u1のアクションを2つのセッションに分割します。

+0

おかげ@jaceklaskowski。もう一つの質問が助けになりました。 –

+0

もう1つ同様の質問が返されました: https://stackoverflow.com/questions/44020343/spark-dataframe-access-of-previous-calculated-row –

答えて

1

集計古き良きSQLを使用して、すべての列:

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

またはデータセットAPI:

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

悲しいことに、次の行が返されます。 '[(u1 100 241 (u2 143 158 [edit4、edit5])] ' と同じユーザーに対して別々のセッションを維持しません。 u1には、2つのセッションを表す2つの行が必要です。 –

関連する問題