我实际上正在处理一个流,接收一堆字符串并需要计算所有字符串。总和是加重的,这意味着第二个记录的总和被添加到前一天 输出必须是一些看起来像
的json文件{
"aggregationType" : "day",
"days before" : 2,
"aggregates" : [
{"date" : "2018-03-03",
"sum" : 120},
{"date" :"2018-03-04",
"sum" : 203}
]
}
我创建了一个类似于:
的流val eventStream : DataStream [String] =
eventStream
.addSource(source)
.keyBy("")
.TimeWindow(Time.days(1), Time.days(1))
.trigger(new MyTriggerFunc)
.aggregation(new MyAggregationFunc)
.addSink(sink)
提前感谢您的帮助:)
答案 0 :(得分:1)
关于在Flink中使用JSON的注意事项:
使用JSONDeserializationSchema
反序列化事件,这将生成ObjectNode
个。为方便起见,您可以将ObjectNode
映射到YourObject
,或继续使用ObjectNode
。
使用ObjectNode
:http://www.baeldung.com/jackson-json-node-tree-model
回到你的案例,你可以这样做:
val eventStream : DataStream [ObjectNode] =
oneMinuteAgg
.addSource(source)
.windowAll()
.TimeWindow(Time.minutes(1))
.trigger(new MyTriggerFunc)
.aggregation(new MyAggregationFunc)
将输出1分钟聚合
的流[
{
"date" :2018-03-03
"sum" : 120
},
{
"date" :2018-03-03
"sum" : 120
}
]
然后将另一个运算符链接到“oneMinuteAgg”,它将1min聚合添加到1day聚合中:
[...]
oneMinuteAgg
.windowAll()
.TimeWindow(Time.days(1))
.trigger(new Whatever)
.aggregation(new YourDayAggF)
将输出您需要的内容
{
"aggregationType" : "day"
"days before" : 4
"aggregates : [{
"date" :2018-03-03
"sum" : 120
},
{
"date" :2018-03-03
"sum" : 120
}]
}
我使用windowAll()
假设您不需要键入流。