在pyspark中添加主题内排名有序的交互日列

在pyspark中添加主题内排名有序的交互日列,pyspark,pyspark-dataframes,Pyspark,Pyspark Dataframes,我有一个大型pyspark数据框架,其中包含多年的用户交互数据。有很多列,但是对于这个问题,有三个有用的列是userid、interaction\u date和interaction\u timestamp。假设表中给定用户有多个条目 我需要编写一个函数来添加一列,该列将指示表中给定客户最晚观察到的交互之前的天数。例如,对于输入表 我想添加一列,从该用户最近的交互日期开始计算(例如,最近的交互日期为1,下一个最近的交互日期为2,等等): 有谁能引导我朝着正确的方向做这件事吗?你可以通过这样的

我有一个大型pyspark数据框架,其中包含多年的用户交互数据。有很多列,但是对于这个问题,有三个有用的列是
userid
interaction\u date
interaction\u timestamp
。假设表中给定用户有多个条目

我需要编写一个函数来添加一列,该列将指示表中给定客户最晚观察到的交互之前的天数。例如,对于输入表

我想添加一列,从该用户最近的交互日期开始计算(例如,最近的交互日期为1,下一个最近的交互日期为2,等等):


有谁能引导我朝着正确的方向做这件事吗?

你可以通过这样的功能来实现。请看下面的评论:

从pyspark.sql.window导入窗口
导入pyspark.sql.F函数
cols=['userid','interaction\u timestamp']
数据=[('1','2018-01-02'),
( '2'        , '2018-01-03' ),
( '1'        , '2018-01-03' ),
( '1'        , '2018-01-04' ),
( '2'        , '2018-01-02' ),
( '3'        , '2018-01-03' ),
( '4'        , '2018-01-03' )]
df=spark.createDataFrame(数据,cols)
df=df.withColumn('interaction\u timestamp',F.to\u date('interaction\u timestamp','yyyy-MM-dd'))
#具有相同用户标识的行成为同一分区的一部分
#这些分区将按交互时间戳按降序排列
w=Window.partitionBy('userid').orderBy(F.desc('interaction_timestamp'))
#密集排列将根据定义的顺序为每一行分配一个数字
df.withColumn(“交互日期顺序”,F.dense\u rank().over(w)).show()
输出:

+------+---------------------+----------------------+ 
|userid|interaction_timestamp|interaction_date_order| 
+------+---------------------+----------------------+ 
|     3|           2018-01-03|                     1| 
|     1|           2018-01-04|                     1| 
|     1|           2018-01-03|                     2| 
|     1|           2018-01-02|                     3| 
|     4|           2018-01-03|                     1| 
|     2|           2018-01-03|                     1| 
|     2|           2018-01-02|                     2|
+------+---------------------+----------------------+

请避免堆栈溢出。好的!我试着先手动构建一个表,但结果非常混乱:太棒了!谢谢