ProcessWindowFunction
在某些情况下,统计更复杂的指标可能需要依赖于窗口中所有的数据元素,或需要操作窗口中的状态数据和窗口元数据,这时就需要使用到ProcessWindowsFunction,ProcessWindowsFunction 能够更加灵活地支持基于窗口全部数据元素的结果计算, 例如对整个窗口数据排序取 TopN , 这样的需要就必须使用ProcessWindowFunction。
object TestProcessFuntionWindow
{
def main(args: Array[String]): Unit =
{
val env = StreamExecutionEnvironment.getExecutionEnvironment
val socketStream = env.socketTextStream("localhost", 9999)
/*获取stream 读取数据源 */
val stream = socketStream.map(line =>
{
import com.jh.source.StationLog
val splited = line.split(",")
StationLog(splited(0).trim, splited(1).trim, splited(2).trim, splited(3).trim, splited(4).trim.toLong, splited
(5).trim.toLong)
})
stream.map(log => (log.sid, 1.toLong))
.keyBy(_._1)
.window(SlidingProcessingTimeWindows.of(Time.seconds(5), Time.seconds(3)))
/*IN, OUT, KEY, W <: Window*/
.process(new ProcessWindowFunction[(String, Long), (String, Long), String, TimeWindow]
{
/*一个窗口结束调用一次(在一个并行度中),因为他是全量的聚合函数*/
override def process(key: String, context: Context, elements: Iterable[(String, Long)], out: Collector[
(String, Long)]): Unit =
{
println("----------")
/*注意:整个窗口的数据保存到 Iterable 里面有很多数据 迭代器的size就是日志的总条数 */
out.collect((key, elements.size))
}
})
.print()
env.execute()
}
}