我正在尝试计算在当前日期的任一天的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()
+---+----+----------+
| id|item|time_stamp|
+---+----+----------+
| 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|
+---+----+----------+
这里的timestamp
只是一个任意的日期值。假设我们忽略了一个瞬间的日期,为了获得具有这种布局的框架的成对计数,我将数据复制为别名列名称,然后进行过滤联接。
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天之内。在data
中使用3个不同的时间戳值,这意味着3个不同的帧,在这些帧中我计算成对的不同计数。如何在PySpark中使用Window
来实现此目的?有没有更有效的方法来获取不同的成对计数?