我有一个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做同样的事情?
答案 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"))