微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spark结构化流:在滚动窗口的末尾而不是批处理中输出结果

如何解决Spark结构化流:在滚动窗口的末尾而不是批处理中输出结果

我希望将Spark Stream的输出在翻滚窗口的末尾而不是在批处理间隔发送到接收器。

我正在从Kafka流中读取并输出到另一个Kafka流中。

用于查询和写入输出代码如下:

Dataset<Row> sqlResult = session.sql("select window,user,sum(amount) as amount from users where type = 'A' group by window(timestamp,'1 minute','1 minute'),user");
sqlResult = sqlResult.select(to_json(struct("window","user","amount")).as("value"));

StreamingQuery query = sqlResult.writeStream()
    .format("kafka")
    .option("kafka.bootstrap.servers","localhost:9092")
    .option("topic","aggregated-topic")
    .option("checkpointLocation","c:/tmp")
    .outputMode(OutputMode.Update())
    .start();

当我在 1分钟的窗口内为特定用户发送多条记录时,我希望在1分钟结束时将这些事件的总和。

但是我在输出的Kafka流上获得了多个输出,并且写入了间歇性的聚合。

例如

我将在一分钟内以下列间隔发送以下7条记录。


>{ "id" : 123,"type": "A","user": "tukaram","amount": 10}
>{ "id" : 123,"amount": 10}

我得到的输出是这个:

{"window":{"start":"2020-09-18T14:35:00.000+05:30","end":"2020-09-18T14:36:00.000+05:30"},"user":"tukaram","amount":10.0}
{"window":{"start":"2020-09-18T14:35:00.000+05:30","amount":20.0}
{"window":{"start":"2020-09-18T14:35:00.000+05:30","amount":40.0}
{"window":{"start":"2020-09-18T14:35:00.000+05:30","amount":60.0}
{"window":{"start":"2020-09-18T14:35:00.000+05:30","amount":70.0}

您可以看到,输出在同一窗口内,但是有多个输出

我想要的是分钟结束时的单个输出

{"window":{"start":"2020-09-18T14:35:00.000+05:30","amount":70.0}

我该如何实现?

解决方法

将流写入接收器时,您需要设置处理触发器。

使用具有适当触发值的DataStreamWriter的.trigger(Trigger.ProcessingTime)。


StreamingQuery query = sqlResult.writeStream()
        .trigger(Trigger.ProcessingTime("1 minute")) //this

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。