使用 PySpark 获取客户购买的新近时间
Taking the recency time of client purchase with PySpark
我正在处理的数据集样本:
data = [(1, "2021-11-08"), (1, "2021-11-06"), (1, "2021-10-08"), (2, "2021-11-01"), (2, "2021-10-20"),
(2, "2021-08-05"), (3, "2021-08-02"), (3, "2021-05-08"), (3, "2021-03-01")]
df = spark.createDataFrame(data=data,schema=columns)
我想取客户最近的购买量(客户的 date.max())和之前的最大购买量(倒数第二次购买)并取两者之间的差值(我假设所有购买的产品相同)。我仍然没有在 pyspark 中找到可以做到这一点的东西。我的想法的一个例子是在 groupby 中执行此操作,如下面的最小日期和最大日期。
df1 = df.withColumn('data',to_date(df.data))
dados_agrupados_item = df1.groupBy(["cliente"]).agg(max("data"), \
min("data"), \
)
输出为:
对于我的问题,输出将是该客户的最大日期和倒数第二个购买日期。输出应该是:
另一种方法也可以直接传递这两个日期之间的差异。但是我不知道如何实现它。
非常感谢您。
使用 group by 和 collect_list 收集每个组的所有日期
使用reverse/array_sort强制数组降序。
参考第一次和第二次购买。 (我们希望他们购买了两次,否则我们需要更复杂的逻辑来处理。)
df1.groupBy(["Client"])\
.agg(
reverse( # collect all the dates in an array in descending order from most recent to oldest.
array_sort(
collect_list( df1.data ))).alias("dates") )\
.select(
col("Client"),
col("dates")[0].alias("last_purchase"), # get last purchase
col("dates")[1].alias("penultimate") )\ #get last purchase + 1
.show()
+------+-------------+-----------+
|Client|last_purchase|penultimate|
+------+-------------+-----------+
| 1| 2021-11-08| 2021-11-06|
| 3| 2021-08-02| 2021-05-08|
| 2| 2021-11-01| 2021-10-20|
+------+-------------+-----------+
我正在处理的数据集样本:
data = [(1, "2021-11-08"), (1, "2021-11-06"), (1, "2021-10-08"), (2, "2021-11-01"), (2, "2021-10-20"),
(2, "2021-08-05"), (3, "2021-08-02"), (3, "2021-05-08"), (3, "2021-03-01")]
df = spark.createDataFrame(data=data,schema=columns)
我想取客户最近的购买量(客户的 date.max())和之前的最大购买量(倒数第二次购买)并取两者之间的差值(我假设所有购买的产品相同)。我仍然没有在 pyspark 中找到可以做到这一点的东西。我的想法的一个例子是在 groupby 中执行此操作,如下面的最小日期和最大日期。
df1 = df.withColumn('data',to_date(df.data))
dados_agrupados_item = df1.groupBy(["cliente"]).agg(max("data"), \
min("data"), \
)
输出为:
对于我的问题,输出将是该客户的最大日期和倒数第二个购买日期。输出应该是:
另一种方法也可以直接传递这两个日期之间的差异。但是我不知道如何实现它。
非常感谢您。
使用 group by 和 collect_list 收集每个组的所有日期
使用reverse/array_sort强制数组降序。
参考第一次和第二次购买。 (我们希望他们购买了两次,否则我们需要更复杂的逻辑来处理。)
df1.groupBy(["Client"])\
.agg(
reverse( # collect all the dates in an array in descending order from most recent to oldest.
array_sort(
collect_list( df1.data ))).alias("dates") )\
.select(
col("Client"),
col("dates")[0].alias("last_purchase"), # get last purchase
col("dates")[1].alias("penultimate") )\ #get last purchase + 1
.show()
+------+-------------+-----------+
|Client|last_purchase|penultimate|
+------+-------------+-----------+
| 1| 2021-11-08| 2021-11-06|
| 3| 2021-08-02| 2021-05-08|
| 2| 2021-11-01| 2021-10-20|
+------+-------------+-----------+