2016-12-09 36 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"))