【发布时间】: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