Pyspark 滚动窗口上的成对计数

Pyspark 滚动窗口上的成对计数,pyspark,window-functions,pyspark-dataframes,Pyspark,Window Functions,Pyspark Dataframes,我试图计算在当前日期两侧1天的动态滚动窗口内发生的每个可能项目对的不同ID数。数据的布局与此类似: data = spark.createDataFrame([(1, 'a', 1), (1, 'b', 1), (2, 'a', 1), (2, 'b', 1), (3, 'a', 1), (3, 'b', 1), (3, 'a', 1), (2, 'c', 1), (1, 'a', 2), (

我试图计算在当前日期两侧1天的动态滚动窗口内发生的每个可能项目对的不同ID数。数据的布局与此类似:

data = spark.createDataFrame([(1, 'a', 1), (1, 'b', 1), (2, 'a', 1), (2, 'b', 1),
                              (3, 'a', 1), (3, 'b', 1), (3, 'a', 1), (2, 'c', 1),
                      (1, 'a', 2), (1, 'b', 2), (2, 'a', 2), (2, 'b', 2),
                      (1, 'a', 3), (1, 'b', 3), (2, 'a', 3), (2, 'b', 3)], ['id', 'item', 'time_stamp'])

data.show()
这里的
时间戳
只是一个任意的日期值。假设我们暂时忽略了日期,为了使用此布局获得帧上的成对计数,我使用别名列名复制数据,并进行过滤联接

data_temp = data.drop("time_stamp")
data_temp2 = data_temp.withColumnRenamed('id', 'id2').withColumnRenamed('item', 'item2')

res = data_temp.join(data_temp2, (data_temp.id == data_temp2.id2) & (data_temp.item > data_temp2.item2))\
    .groupBy(data_temp.item.alias("item1"), data_temp2.item2)\
    .agg(F.countDistinct(data_temp.id).alias("dist_counts"))

res.show()
结果:

+-----+-----+-----------+
|item1|item2|dist_counts|
+-----+-----+-----------+
|    b|    a|          3|
|    c|    b|          1|
|    c|    a|          1|
+-----+-----+-----------+


现在我想这样做,但在当前时间戳的+/-1天窗口内。对于
数据中的3个不同的时间戳值
,这意味着我将在3个不同的帧中计算两两不同的计数。如何使用PySpark中的
窗口
实现此功能?是否有更有效的方法获取不同的成对计数?

请向我们显示预期输出
+-----+-----+-----------+
|item1|item2|dist_counts|
+-----+-----+-----------+
|    b|    a|          3|
|    c|    b|          1|
|    c|    a|          1|
+-----+-----+-----------+