带步进火花的窗口时间序列/

2024-04-29 14:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的意见:

timestamp,user
1,A
2,B
5,C
9,E
12,F

结果是:

timestampRange,userList
1 to 2,[A,B]
3 to 4,[] Or null
5 to 6,[C]
7 to 8,[] Or null
9 to 10,[E]
11 to 12,[F]

我尝试使用Window,但问题是,它不包括空的时间戳范围。你知道吗

任何提示都会有帮助。你知道吗


Tags: orto时间windownulltimestamp意见user
1条回答
网友
1楼 · 发布于 2024-04-29 14:28:02

不知道widowing函数是否会覆盖范围之间的间隙,但您可以采取以下方法:

定义数据帧df_ranges

 val ranges = List((1,2), (3,4), (5,6), (7,8), (9,10))
 val df_ranges = sc.parallelize(ranges).toDF("start", "end")
+  -+ -+
|start|end|
+  -+ -+
|    1|  2|
|    3|  4|
|    5|  6|
|    7|  8|
|    9| 10|
+  -+ -+

时间戳列为df_data的数据:

val data = List((1,"A"), (2,"B"), (5,"C"), (9,"E"))
val df_data = sc.parallelize(data).toDF("timestamp", "user")
+    -+  +
|timestamp|user|
+    -+  +
|        1|   A|
|        2|   B|
|        5|   C|
|        9|   E|
+    -+  +

连接start, end, timestamp列上的两个数据帧:

df_ranges.join(df_data, df_ranges.col("start").equalTo(df_data.col("timestamp")).or(df_ranges.col("end").equalTo(df_data.col("timestamp"))), "left")

+  -+ -+    -+  +
|start|end|timestamp|user|
+  -+ -+    -+  +
|    1|  2|        1|   A|
|    1|  2|        2|   B|
|    5|  6|        5|   C|
|    9| 10|        9|   E|
|    3|  4|     null|null|
|    7|  8|     null|null|
+  -+ -+    -+  +

现在用collect_list函数做一个简单的聚合:

 res4.groupBy("start", "end").agg(collect_list("user")).orderBy("start")
+  -+ -+         +
|start|end|collect_list(user)|
+  -+ -+         +
|    1|  2|            [A, B]|
|    3|  4|                []|
|    5|  6|               [C]|
|    7|  8|                []|
|    9| 10|               [E]|
+  -+ -+         +

相关问题 更多 >