0基础学习PyFlink——时间滑动窗口(Sliding Time Windows)

《0基础学习PyFlink------时间滚动窗口(Tumbling Time Windows)》我们介绍了不会有重复数据的时间滚动窗口。本节我们将介绍存在重复计算数据的时间滑动窗口。

关于滑动窗口,可以先看下《0基础学习PyFlink------个数滑动窗口(Sliding Count Windows)》。下图就是个数滑动窗口示意图。

我们看到个数滑动窗口也会因为窗口内数据不够而不被触发。但是时间滑动窗口则可以解决这个问题,我们只要把窗口改成时间类型即可。

相应的代码我们参考《0基础学习PyFlink------时间滚动窗口(Tumbling Time Windows)》,只要把TumblingProcessingTimeWindows改成SlidingProcessingTimeWindows,并增加一个偏移参数(Time.milliseconds(1))即可。这意味着我们将运行一个时间长度为2毫秒,每次递进1毫秒的窗口。

完整代码

python 复制代码
from typing import Iterable
import time
from pyflink.common import Types, Time
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import  TimeWindow, SlidingProcessingTimeWindows
   
class SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):
    def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):
        print(*inputs, window)
        return [(key,  len([e for e in inputs]))]


word_count_data = [("A",2),("A",1),("A",4),("A",3),("A",6),("A",5),("A",7),("A",8),("A",9),("A",10),
                   ("A",11),("A",12),("A",13),("A",14),("A",15),("A",16),("A",17),("A",18),("A",19),("A",20)]

def word_count():
    env = StreamExecutionEnvironment.get_execution_environment()
    env.set_runtime_mode(RuntimeExecutionMode.STREAMING)
    # write all the data to one file
    env.set_parallelism(1)

    source_type_info = Types.TUPLE([Types.STRING(), Types.INT()])
    # define the source
    # mappging
    source = env.from_collection(word_count_data, source_type_info)
    # source.print()

    # keying
    keyed=source.key_by(lambda i: i[0]) 
    
    # reducing
    reduced=keyed.window(SlidingProcessingTimeWindows.of(Time.milliseconds(2), Time.milliseconds(1))) \
                    .apply(SumWindowFunction(),
                        Types.TUPLE([Types.STRING(), Types.INT()]))
        
    # # define the sink
    reduced.print()

    # submit for execution
    env.execute()

if __name__ == '__main__':
    word_count()

运行结果

运行两次上述代码,我们发现每次都不同,而且有重叠计算的元素。

('A', 2) ('A', 1) ('A', 4) TimeWindow(start=1698773292650, end=1698773292652)

('A', 2) ('A', 1) ('A', 4) ('A', 3) ('A', 6) ('A', 5) ('A', 7) ('A', 8) ('A', 9) ('A', 10) ('A', 11) TimeWindow(start=1698773292651, end=1698773292653)

(A,3)

(A,11)

('A', 3) ('A', 6) ('A', 5) ('A', 7) ('A', 8) ('A', 9) ('A', 10) ('A', 11) ('A', 12) ('A', 13) ('A', 14) ('A', 15) ('A', 16) ('A', 17) ('A', 18) ('A', 19) ('A', 20) TimeWindow(start=1698773292652, end=1698773292654)

(A,17)

('A', 2) ('A', 1) ('A', 4) TimeWindow(start=1698773319933, end=1698773319935)

('A', 2) ('A', 1) ('A', 4) ('A', 3) ('A', 6) ('A', 5) ('A', 7) ('A', 8) ('A', 9) ('A', 10) ('A', 11) ('A', 12) TimeWindow(start=1698773319934, end=1698773319936)

(A,3)

(A,12)

('A', 3) ('A', 6) ('A', 5) ('A', 7) ('A', 8) ('A', 9) ('A', 10) ('A', 11) ('A', 12) ('A', 13) ('A', 14) ('A', 15) ('A', 16) ('A', 17) ('A', 18) ('A', 19) ('A', 20) TimeWindow(start=1698773319935, end=1698773319937)

(A,17)

参考资料

相关推荐
无限大.6 分钟前
验证码对抗史
java·开发语言·python
LeonIter14 分钟前
国家按产业占比分类,我国纳入哪类?
大数据·人工智能
俊哥大数据23 分钟前
【项目实战1】大数据项目开发案例---新闻资讯离线分析|实时分析|大数据仓库|推荐系统|数据可视化项目
数据仓库·hadoop·flink·spark·推荐系统·实时分析·离线分析
电商API_1800790524724 分钟前
Python爬虫从入门到实战:核心技术与合规指南
大数据·数据库·爬虫
南_山无梅落44 分钟前
4-Python3输入输出学习笔记:input()与print()的灵活使用
笔记·python·学习·input·print
CNRio1 小时前
数字经济健康发展的双维路径:技术伦理与产业价值的重构
大数据·人工智能·重构
心动啊1211 小时前
简单学下chromaDB
开发语言·数据库·python
江上鹤.1481 小时前
Day33类装饰器
开发语言·python
阿龙AI日记1 小时前
保姆级教程:Anaconda+Cuda+Torch+Pycharm配置指南
ide·pytorch·python·pycharm
测试人社区—小叶子1 小时前
边缘计算与AI:下一代智能应用的核心架构
运维·网络·人工智能·python·架构·边缘计算