2016-12-09 91 views
0

我有一個DataFrame(df),它的列是userid(用戶標識),day(當天)。pySpark,聚合複合函數(連續事件的差異)

我感興趣的是爲每個用戶計算每天他/她活躍之間的平均時間間隔。

例如,對於一個給定的用戶數據幀可以是這個樣子

userid  day  
1   2016-09-18   
1   2016-09-20 
1   2016-09-25  

如果數據幀是熊貓數據框,我可以計算的數量我感興趣的是這樣的

import numpy as np 
np.mean(np.diff(df[df.userid==1].day)) 

然而,這是非常低效的,因爲我有幾百萬個數據幀的用戶,但我相信這是可以做到這樣

df.groupby("userid").agg({"day": lambda x: np.mean(np.diff(x))}) 

第一個問題是我不確定這是否正常工作,因爲在應用np.mean(np.diff(x))之前需要對日期進行排序。

第二個問題是,這是效率低下,因爲我只能在將DataFrame轉換爲Pandas DataFrame時執行此操作。

有沒有辦法與pySpark做同樣的事情?

回答

1

窗口功能來救援。一些進口:

from pyspark.sql.functions import col, datediff, lag 
from pyspark.sql.window import Window 

窗口定義

w = Window().partitionBy("userid").orderBy("day") 

和查詢

(df 
    .withColumn("diff", datediff(lag("day", 1).over(w), "day")) 
    .groupBy("userid") 
    .mean("diff"))