在公共视图上具有不同触发间隔中继的 Spark Structured Streaming 多个查询

Spark Structured Streaming multiple queries with different trigger interval relay on common view

假设我们有一个结构化流式应用程序,其中我们有多个具有不同触发间隔并依赖于一些公共视图的接收器。 Spark 将如何处理公共视图:自动缓存还是多次处理?

以下为伪代码

val ds = spark.readStream.format("kafka").load()

ds.select(udf1(a) as a, udf2(b) as b, udf3(c) as c)
  .withWatermark(c, "1 minute")
  .createTempView("t0") // how will this line be handled?

spark.sql("select max(a) from t0 group by window(c, '1 minute')")
     .writeStream.format("kafka")
     .trigger(ProcessingTime("1 minute")) //one minute
     .start()

spark.sql("select max(b) from t0 group by window(c, '1 minute')")
     .writeStream.format("kafka")
     .trigger(ProcessingTime("5 minutes"))
     .start()

spark.streams.awaitAnyTermination()

更新

水印会独立处理吗?我的猜测是水印是 在每个 writeStream.

中单独维护

在你的例子中,这两个查询独立地从Kafka读取,数据将被处理两次。当你调用 Dataset.createTempView 时,Spark 只记住名称和数据集的逻辑计划。下次当您使用临时视图时,Spark 只需插入逻辑计划,其行为就像您在数据集上调用方法一样。 Spark 中临时视图的概念与数据库临时视图非常相似