Flink 窗口聚合函数之ReduceFunction实践


一、ReduceFunction的概念

Flink使用ReduceFunction来对窗口中的元素进行增量聚合。要求输入和输出的数据类型一致,定义了如何把两个输入的元素进行合并来生成相同类型的输出元素的过程。

二、案例实践:每隔5秒统计通话日志的数量

1.日志数据对象

case class Log(sid:String,var callOut:String, var callIn:String, callType:String, callTime:Long, duration:Long)

 

2.统计

 1 object TestReduceFunctionByWindow {
 2   def main(args: Array[String]): Unit = {
 3 
 4     val env = StreamExecutionEnvironment.getExecutionEnvironment
 5     // 数据源
 6     var stream = env.socketTextStream("flink101", 8888)
 7       .map(line => {
 8         var arr = line.split(",")
 9         // 转成日志对象
10         Log(arr(0).trim,arr(1).trim, arr(2).trim, arr(3).trim, arr(4).trim.toLong, arr(5).trim.toLong)
11       })
12 
13     val result = stream.map(log=> (log.sid, 1))
14       .keyBy(_._1)
15         .timeWindow(Time.seconds(5))
16         .reduce((t1,t2) => (t1._1, t1._2 + t2._2))  // 输入和输出数据类型一致
17 
18     // 打印测试
19     result.print()
20 
21     env.execute("TestReduceFunctionByWindow")
22   }
23 }

三、总结

使用ReduceFunction能够快速对两个相同类型的数据元素按照指定的方法进行聚合逻辑,实现sum功能。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM