pySpark,聚合函数(连续事件的差异)

时间:2016-12-09 17:22:49

标签: python pandas apache-spark pyspark

我有一个DataFrame(df),其列为userid(用户ID),day(当天)。

我感兴趣的是为每个用户计算他/她活跃的每一天之间的平均时间间隔。

例如,对于给定用户,DataFrame可能看起来像这样

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

如果DataFrame是Pandas DataFrame,我可以像这样计算我感兴趣的数量

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

然而,由于我在DataFrame中拥有数百万用户,因此效率非常低,但我相信它可以通过这种方式完成

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

第一个问题是我不确定这是否正常,因为在应用np.mean(np.diff(x))之前需要对日期进行排序。

第二个问题是,这是低效的,因为我只能在将DataFrame转换为Pandas DataFrame时才这样做。

有没有办法用pySpark做同样的事情?

1 个答案:

答案 0 :(得分: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"))