[英]Compute metrics on different window in Apache FLink
我正在使用Apache Flink 1.2,这是我的问题:我有一个数据流,我想在1天的时间范围内计算一个指标。 因此,我将编写如下内容:
DataStream<Tuple6<Timestamp, String, Double, Double, Double, Integer>> myStream0 =
env.readTextFile("Myfile.csv")
.map(new MyMapper()) // Parse the input
.assignTimestampsAndWatermarks(new MyExtractor()) //Assign the timestamp of the event
.timeWindowAll(Time.days(1))
.apply(new average()); // compute average, max, sum
现在,我想在1小时的时间内计算出相同的指标。
我可以像以前一样编写并指定Time.hours(1),但是我担心的是,以这种方式apache flink读取了两倍的输入文件,并且完成了两倍的工作。 我想知道是否有一种方法可以完成所有的Togheter(即使用相同的流)。
您可以计算小时汇总,也可以从这些每日汇总中计算。 这将寻找一个简单的DataStream<Double>
,如下所示:
DataStream<Double> vals = ... // source + timestamp extractor
DataStream<Tuple2<Double, Long>> valCnt = vals // (sum, cnt)
.map(new CntAppender()) // Double -> Tuple2<Double, Long(1)>
DataStream<Tuple3<Double, Long, Long>> hourlySumCnt = valCnt // (sum, cnt, endTime)
.timeWindowAll(Time.hours(1))
// SumCounter ReduceFunction sums the Double and Long field (Long is Count)
// WindowEndAppender WindowFunction adds the window end timestamp (3rd field)
.reduce(new SumCounter(), new WindowEndAppender())
DataStream<Tuple2<Double, Long>> hourlyAvg = hourlySumCnt // (avg, endTime)
.map(new SumDivCnt()) // MapFunction divides Sum by Cnt for average
DataStream<Tuple3<Double, Long, Long>> dailySumCnt = hourlySumCnt // (sum, cnt, endTime)
.map(new StripeOffTime()) // removes unnecessary time field -> Tuple2<Double, Long>
.timeWindowAll(Time.days(1))
.reduce(new SumCounter(), new WindowEndAppender()) // same as above
DataStream<Tuple2<Double, Long>> dailyAvg = dailySumCnt // (avg, endTime)
.map(new SumDivCnt()) // same as above
因此,您基本上可以计算每个小时的总和和计数,然后根据该结果,
请注意,我正在使用ReduceFunction
而不是WindowFunction
进行求和和计数,因为急切地应用了ReduceFunction
,即未收集窗口的所有记录,而是立即对其进行汇总。 因此,需要维护的状态是单个记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.