【问题标题】:flink streaming maintain state of particular events in the windowflink 流式维护窗口中特定事件的状态
【发布时间】:2020-03-29 23:06:05
【问题描述】:

我有一个Flink 流系统,我可以在其中获取点击流数据。

数据格式:

{"uid":"123", "event_type":"view","payload":{"p1":{"price":23}}}
{"uid":"123", "event_type":"view","payload":{"p2":{"price":25}}}
{"uid":"123", "event_type":"a2c","payload":{"p2"}}
{"uid":"123", "event_type":"a2c","payload":{"p1":{}}}

所以,我们看到这里有两种类型的事件a2c 和view。这两种事件的区别在于view 事件的价格适用于所有产品,而a2c 中只有名称,没有价格。

我想要实现的是在 10 分钟的窗口内从所有事件中创建一个整合的有效负载。还可以通过从其对应的view 事件中获取price 信息来丰富a2c 的有效负载。

每个 uid 的窗口结束后合并有效负载:

{
    "uid":"123",
    "all":[
        {"event_type":"view", "payload":{"p1":{"price":23}}},
        {"event_type":"view","payload":{"p2":{"price":25}}},
        {"event_type":"a2c","payload":{"p2":{"price":25}}},
        {"event_type":"a2c","payload":{"p1":{"price":23}}}
    ],
   "total":4
}

我怎样才能做到这一点? 基本上我必须保持窗口中所有view 事件的状态,然后一旦我得到a2c 事件,我必须从状态中获取价格。 我不是要求任何可行的解决方案,只是如何维护窗口中所有view 事件的状态。 我还有一些自定义的 Reduce 操作。

events.keyBy("uid").window(..).reduce(new ReduceCustomFun(..)).uid("..").name("..");

在ReduceCustomFun:我正在将 2 个事件数据加入列表中。

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

    最简单的做法是使用ProcessWindowFunction,它在每 10 分钟窗口结束时执行所有窗口处理。然后,您将拥有一个 Iterable,其中包含所有事件(对于给定的 uid),您可以从中创建综合报告,并且您不必担心维护任何状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多