多行处理Spark结构化流

时间:2019-12-26 10:41:26

标签: apache-spark spark-structured-streaming

我想使用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中,因此我无法执行所需的操作。

作为一种替代方法,我尝试了透视,但不适用于流式传输。它仅适用于批处理。

此方案将是什么解决方案?

1 个答案:

答案 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|
+-----+-------------+-------------+------+