我想使用Spark结构化流处理多行数据集。示例数据集如下所示
{"reqID":"id3", "time":1577085247000, "type":"start"}
{"reqID":"id3", "time":1577085250000, "type":"sysstart"}
{"reqID":"id3", "time":1577085256000, "type":"sysend"}
{"reqID":"id3", "time":1577085260000, "type":"end"}
{"reqID":"id4", "time":1577085263000, "type":"start"}
{"reqID":"id4", "time":1577085266000, "type":"sysstart"}
{"reqID":"id4", "time":1577085269000, "type":"sysend"}
{"reqID":"id4", "time":1577085278000, "type":"end"}
我想基于end_time(time for type end) - start_time(type for type start)
执行类似reqID
的操作。
我尝试按reqID
进行分组,我可以在聚合期间合并事件,但是合并后的事件在ArrayType
中,因此我无法执行所需的操作。
作为一种替代方法,我尝试了透视,但不适用于流式传输。它仅适用于批处理。
此方案将是什么解决方案?
答案 0 :(得分:1)
您可以使用where和join条件,选择想要的片段,加入它们并根据需要进行操作:
df.where($"type" === "start")
.drop("type")
.withColumnRenamed("time", "startTime")
.join(df.where($"type" === "end")
.drop("type")
.withColumnRenamed("time", "endTime"), "reqID")
.withColumn("result", $"endTime" - $"startTime")
输出
+-----+-------------+-------------+------+
|reqID| startTime| endTime|result|
+-----+-------------+-------------+------+
| id3|1577085247000|1577085260000| 13000|
| id4|1577085263000|1577085278000| 15000|
+-----+-------------+-------------+------+