成对计算滚动窗口

时间:2020-09-15 16:02:09

标签: 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, '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来实现此目的?有没有更有效的方法来获取不同的成对计数?

0 个答案:

没有答案