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)

参考资料

相关推荐
云空13 分钟前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
测试杂货铺1 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森1 小时前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、2 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
拓端研究室TRL2 小时前
【梯度提升专题】XGBoost、Adaboost、CatBoost预测合集:抗乳腺癌药物优化、信贷风控、比特币应用|附数据代码...
大数据
黄焖鸡能干四碗2 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
编码小袁2 小时前
探索数据科学与大数据技术专业本科生的广阔就业前景
大数据
Chef_Chen2 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空3 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务