如何使用flink流式传输json?

时间:2018-03-20 09:41:46

标签: json apache-flink flink-streaming flink-cep flink-sql

我实际上正在处理一个流,接收一堆字符串并需要计算所有字符串。总和是加重的,这意味着第二个记录的总和被添加到前一天 输出必须是一些看起来像

的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)

提前感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

关于在Flink中使用JSON的注意事项:

使用JSONDeserializationSchema反序列化事件,这将生成ObjectNode个。为方便起见,您可以将ObjectNode映射到YourObject,或继续使用ObjectNode

使用ObjectNodehttp://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()假设您不需要键入流。