假设我们有一个结构化流应用程序,其中我们有多个具有不同触发间隔的接收器并依赖于某些公共视图。 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
单独签名。
答案 0 :(得分:3)
在您的情况下,这两个查询独立于Kafka读取,数据将被处理两次。当您致电Dataset.createTempView
时,Spark会记住带有数据集逻辑计划的名称。下次使用临时视图时,Spark只是插入逻辑计划,行为就像在数据集上调用方法一样。 Spark中临时视图的概念与数据库临时视图