【问题标题】:Spark Structured Streaming: Output result at the end of Tumbling Window and not the BatchSpark Structured Streaming:在 Tumbling Window 结束时输出结果而不是 Batch
【发布时间】:2021-01-05 05:26:47
【问题描述】:

我希望 Spark Stream 的输出在 Tumbling Window 结束时发送到 Sink,而不是在批处理间隔。

我正在从 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, "type": "A", "user": "tukaram", "amount": 10}
>{ "id" : 123, "type": "A", "user": "tukaram", "amount": 10}
>{ "id" : 123, "type": "A", "user": "tukaram", "amount": 10}
>{ "id" : 123, "type": "A", "user": "tukaram", "amount": 10}
>{ "id" : 123, "type": "A", "user": "tukaram", "amount": 10}
>{ "id" : 123, "type": "A", "user": "tukaram", "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","end":"2020-09-18T14:36:00.000+05:30"},"user":"tukaram","amount":20.0}
{"window":{"start":"2020-09-18T14:35:00.000+05:30","end":"2020-09-18T14:36:00.000+05:30"},"user":"tukaram","amount":40.0}
{"window":{"start":"2020-09-18T14:35:00.000+05:30","end":"2020-09-18T14:36:00.000+05:30"},"user":"tukaram","amount":60.0}
{"window":{"start":"2020-09-18T14:35:00.000+05:30","end":"2020-09-18T14:36:00.000+05:30"},"user":"tukaram","amount":70.0}

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

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

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

我怎样才能实现它?

【问题讨论】:

    标签: apache-spark spark-streaming spark-structured-streaming spark-streaming-kafka


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多