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

时间:2017-08-17 13:05:04

标签: apache-spark spark-structured-streaming

假设我们有一个结构化流应用程序,其中我们有多个具有不同触发间隔的接收器并依赖于某些公共视图。 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单独签名。

1 个答案:

答案 0 :(得分:3)

在您的情况下,这两个查询独立于Kafka读取,数据将被处理两次。当您致电Dataset.createTempView时,Spark会记住带有数据集逻辑计划的名称。下次使用临时视图时,Spark只是插入逻辑计划,行为就像在数据集上调用方法一样。 Spark中临时视图的概念与数据库临时视图

非常相似