使用 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|
+------+-------------+-----------+