2024-04-29 14:28:02 发布
网友
我有这样的意见:
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,但问题是,它不包括空的时间戳范围。你知道吗
Window
任何提示都会有帮助。你知道吗
不知道widowing函数是否会覆盖范围之间的间隙,但您可以采取以下方法:
定义数据帧df_ranges:
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的数据:
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列上的两个数据帧:
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函数做一个简单的聚合:
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]| + -+ -+ +
不知道widowing函数是否会覆盖范围之间的间隙,但您可以采取以下方法:
定义数据帧
df_ranges
:时间戳列为
df_data
的数据:连接
start, end, timestamp
列上的两个数据帧:现在用
collect_list
函数做一个简单的聚合:相关问题 更多 >
编程相关推荐