pyspark - 在 pyspark 中添加具有主题内排序交互日的列
问题描述
我有一个包含多年用户交互数据的大型 pyspark 数据框。有很多列,但对这个问题有用的三个列是userid
、interaction_date
和interaction_timestamp
。假设表中有给定用户的多个条目。
我需要编写一个函数来添加一个列,该列将指示表中给定客户的最新观察到的交互之前的天数。例如,对于输入表
我想添加一个从该用户最近的交互日期开始计数的列(例如,最近的交互日期是 1,下一个最近的交互日期是 2,等等):
任何人都可以引导我走向正确的方式来做到这一点吗?
解决方案
您可以使用诸如dense_rank 之类的窗口函数来实现这一点。看看下面的评论:
from pyspark.sql.window import Window
import pyspark.sql.functions as F
cols = ['userid','interaction_timestamp']
data =[( '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(data, cols)
df = df.withColumn('interaction_timestamp', F.to_date('interaction_timestamp', 'yyyy-MM-dd'))
#rows with the same userid become part of the the same partition
#these partitions will be ordered descending by interaction_timestamp
w = Window.partitionBy('userid').orderBy(F.desc('interaction_timestamp'))
#dense_rank will assign a number to each row according to the defined order
df.withColumn("interaction_date_order", F.dense_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|
+------+---------------------+----------------------+
推荐阅读
- java - 如何在具有即时运行功能的反编译 apk 中找到我的类?
- r - R闪亮的导航栏到小型设备上的汉堡包
- c++ - C++如何复制一个FILE *指针
- android - 在 MapEngine 初始化之前无法创建 HERE SDK 对象。请参阅 MapEngine.init()
- amazon-web-services - What is definition of Amazon S3 prefix
- c++ - 这是使用 union vs reinterpret_cast 的合适案例吗
- javascript - 制表符:编辑嵌套值并获取父对象
- javascript - 如何解析没有转义双引号的 Angular $http 响应?
- python - 为什么 collections.Counter 运行速度比直接运行它的源代码快
- c# - 如何验证 json 是类对象的正确表示?