Pyspark 滚动窗口上的成对计数
我试图计算在当前日期两侧1天的动态滚动窗口内发生的每个可能项目对的不同ID数。数据的布局与此类似: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), (
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|
+-----+-----+-----------+