Flink窗口触发器类型及实现原理

Flink 窗口触发器(Trigger)(一) Flink的窗口触发器(Trigger)是流处理中一个非常关键的概念,它定义了窗口何时被触发并决定触发后的行为(如进行窗口数据的计算或清理)。 阅读详情

好的,我们来详细介绍一下 Flink 窗口的触发器和其底层实现原理。

Flink 窗口触发器 (Trigger) 详解

核心概念:

  • 窗口 (Window): 定义了如何将无限的数据流切分成有限大小的“桶”进行处理。
  • 窗口函数 (Window Function): 定义了如何计算窗口内数据的最终结果(如 ReduceFunction, AggregateFunction, ProcessWindowFunction)。
  • 触发器 (Trigger): 决定了窗口何时被认为“就绪”,可以将其包含的数据交给窗口函数进行计算。 触发器是窗口机制中控制何时触发计算的关键组件。一个窗口可以关联一个触发器。

一、Flink 提供的常用内置触发器类型

Flink 提供了多种内置触发器,适用于不同的场景:

  1. EventTimeTrigger (基于事件时间):

    • 触发时机: 当 Watermark 到达或超过窗口的结束时间 (end timestamp) 时触发。
    • 用途: 这是处理乱序事件的标准选择。它依赖于正确设置的 Watermark 来推进事件时间,并在 Watermark 越过窗口末端时认为该窗口的所有事件(理论上)都已到达(尽管可能有延迟数据)。
    • 典型窗口: TumblingEventTimeWindows, SlidingEventTimeWindows, SessionEventTimeWindows 的默认触发器。
  2. ProcessingTimeTrigger (基于处理时间):

    • 触发时机: 当系统时间(处理时间)到达或超过窗口的结束时间时触发。
    • 用途: 处理时间窗口的默认选择。计算简单、低延迟,但不处理事件时间乱序问题。结果取决于数据到达系统的速度和系统处理速度。
    • 典型窗口: TumblingProcessingTimeWindows, SlidingProcessingTimeWindows, SessionProcessingTimeWindows 的默认触发器。
  3. CountTrigger (基于元素数量):

    • 触发时机: 当窗口中的元素数量达到或超过预设的阈值 count 时触发。
    • 用途: 适用于需要基于数据量进行计算的场景,比如“每收到 1000 条记录就计算一次”。
    • 组合使用: 常与其他触发器(如 EventTimeTrigger)结合使用,实现“先到先触发”的语义(例如,EventTimeTrigger 保证最终性,CountTrigger 提供低延迟的早期触发)。
  4. DeltaTrigger (基于数据变化量):

    • 触发时机: 当窗口内某个元素相对于上次触发后保留的“状态”(通常是一个代表最新值的元素)的“差值”(Delta),超过用户定义的阈值时触发。需要一个 DeltaFunction 来计算差值。
    • 用途: 适用于监控数据变化的场景,例如监控指标值变化超过某个范围时报警或计算。只有当数据发生显著变化时才触发计算,节省资源。
  5. PurgingTrigger (包装器触发器):

    • 作用: 它本身不决定触发时机,而是包装另一个触发器。当被包装的触发器触发时,PurgingTrigger 会先执行其触发动作(通常是计算窗口函数),然后清除窗口的状态。
    • 用途: 用于节省状态存储空间。例如 PurgingTrigger.of(EventTimeTrigger.create())。标准触发器在触发后通常保留窗口状态以处理可能的延迟数据(对于事件时间窗口),PurgingTrigger 则立即清除状态。注意: 使用它意味着窗口不再处理任何后续到达的延迟数据(包括 onEventTime 触发的延迟数据),因为状态已被清除。
  6. Continuous Processing Time/EventTime Triggers (连续触发):

    • 概念: Flink 允许定义基于处理时间或事件时间的周期性触发器。例如 TriggerBuilder 的 .withProcessingTime() 或 .withEventTime() 方法可以指定触发间隔 (Duration)。
    • 触发时机: 按照设定的时间间隔(如每 5 秒)触发一次。
    • 用途: 提供窗口结果的增量更新(部分结果)。这对于需要近乎实时监控窗口内聚合值变化的场景非常有用。

二、触发器底层实现原理

触发器的实现紧密依赖于 Flink 的 状态管理 和 定时器服务 机制。核心组件和流程如下:

  1. TriggerContext (触发上下文):

    • 这是 Flink 运行时在每个窗口实例化触发器时,提供给触发器的“环境”对象。
    • 关键能力:
      • 访问窗口状态: 通过 getPartitionedState 或 getKeyedState 等方法,触发器可以注册和访问自己的状态(State)。这对于 CountTrigger(计数)、DeltaTrigger(上次触发状态)等至关重要。
      • 注册定时器: 提供 registerEventTimeTimer(timestamp) 和 registerProcessingTimeTimer(timestamp) 方法。触发器在 onElement 或 onMerge 方法中调用这些方法,告诉 Flink 在指定的事件时间戳(需要 Watermark 推进)或处理时间戳到达时,回调自己的 onEventTime 或 onProcessingTime 方法。这是实现基于时间的触发(如 EventTimeTrigger, ProcessingTimeTrigger, 周期性触发)的基础。
      • 删除定时器: deleteEventTimeTimer(timestamp), deleteProcessingTimeTimer(timestamp) 用于取消之前注册的定时器。
      • 获取当前 Watermark / Processing Time: getCurrentWatermark(), getCurrentProcessingTime()。
      • 获取窗口元信息: getWindow()。
  2. 定时器服务 (TimerService):

    • 这是 Flink 内部维护的服务(通常由 InternalTimerService 实现)。
    • 作用: 负责管理所有注册的定时器(事件时间和处理时间)。它内部维护着按时间戳排序的定时器队列(通常基于堆实现)。
    • 处理时间定时器: 由 JobManager 或 TaskManager 上的一个后台线程周期性检查系统时间,当时间到达时,直接调用相应触发器的 onProcessingTime 方法。
    • 事件时间定时器: 依赖于 Watermark。当一个新的 Watermark 到达算子时,定时器服务会检查所有注册的事件时间定时器,找出所有时间戳 小于等于 这个新 Watermark 的定时器,然后调用相应触发器的 onEventTime 方法。Watermark 的推进是事件时间定时器触发的唯一驱动力。
  3. 触发器方法回调流程:

    • onElement(element, timestamp, window, ctx): 每当一个元素被分配到该窗口时调用。这是触发器逻辑的核心入口。触发器在这里可以:
      • 基于元素更新自己的状态(如 CountTrigger 增加计数)。
      • 根据元素的值或时间戳判断是否立即触发(TriggerResult.FIRE)或清除(TriggerResult.PURGE)。
      • 注册新的定时器(用于未来的时间触发)。
      • 删除不再需要的定时器。
    • onEventTime(time, window, ctx): 当之前通过 ctx.registerEventTimeTimer(time) 注册的事件时间定时器到期(即 Watermark >= time)时调用。触发器在这里决定是否触发计算。
    • onProcessingTime(time, window, ctx): 当之前通过 ctx.registerProcessingTimeTimer(time) 注册的处理时间定时器到期(系统时间 >= time)时调用。触发器在这里决定是否触发计算。
    • onMerge(window, ctx): 当会话窗口(或自定义可合并窗口)发生合并时调用。触发器需要在这里合并两个窗口触发器的状态(如合并计数、重新注册定时器等)。
    • clear(window, ctx): 当窗口被清除(通常是由于允许的延迟到期后被完全删除)时调用。触发器应该在这里清理自己注册的任何状态和定时器,释放资源。
  4. TriggerResult (触发结果):

    • 触发器方法 (onElement, onEventTime, onProcessingTime) 必须返回一个 TriggerResult,告知 Flink 运行时接下来需要做什么:
      • CONTINUE: 什么都不做。窗口继续收集数据,等待后续触发条件。
      • FIRE: 触发计算! 将当前窗口的内容传递给 WindowFunction 进行计算。注意: FIRE 不会清除窗口的状态,后续数据仍然可以添加到该窗口中(对于事件时间窗口,这是处理延迟数据的关键)。
      • PURGE: 清除窗口的所有内容(状态)并删除窗口本身。 窗口的生命周期结束。后续到达该窗口的数据会被丢弃(除非窗口分配器重新创建它,但通常不会)。
      • FIRE_AND_PURGE: 先触发计算 (FIRE),然后清除窗口状态并删除窗口 (PURGE)。 这是 PurgingTrigger 包装其他触发器后返回的结果。表示计算完成后立即彻底清理窗口。
  5. 状态后端 (StateBackend):

    • 触发器注册的定时器和自身的状态(通过 TriggerContext 访问的状态)最终都存储在 Flink 配置的 StateBackend(如 RocksDBStateBackend, HashMapStateBackend)中。这保证了在故障恢复时,触发器的状态和注册的定时器能够被正确恢复,从而保证计算语义的正确性(Exactly-Once 或 At-Least-Once)。

总结

  • 触发器类型: Flink 提供多种内置触发器(EventTimeTrigger, ProcessingTimeTrigger, CountTrigger, DeltaTrigger, PurgingTrigger, 周期性触发),满足基于时间、数量、数据变化等不同触发需求。
  • 核心机制:
    • TriggerContext 是触发器与运行时交互的桥梁,提供状态访问和定时器注册能力。
    • 定时器服务 (TimerService) 是底层引擎,负责管理定时器队列并在适当时间(处理时间靠系统时钟轮询,事件时间靠 Watermark 推进)回调触发器的 onXxxTime 方法。
    • 状态后端 (StateBackend) 持久化存储触发器的状态和定时器信息,保证容错性。
    • 回调方法 (onElement, onEventTime, onProcessingTime, onMerge, clear) 定义了触发器在特定事件(元素到达、定时器到期、窗口合并、窗口清除)发生时的行为逻辑。
    • TriggerResult 决定了触发器要求运行时执行的动作(继续、触发计算、清除、触发并清除)。

理解触发器的类型和底层机制(尤其是定时器注册与触发、状态管理、TriggerResult 的含义)对于设计高效、语义正确的 Flink 窗口应用至关重要,特别是在处理乱序事件、控制计算延迟、管理状态大小等方面。

Flink Window 触发机制的关键模型 Flink 触发机制的关键模型 前面的文章,提到Watermark(以下有wm代替)的时候,就说过wm为触发,提供参照物的作用。今天就看用源码看看。 这里有两个情况,先展开讨论下, 第一是,没有窗口,也就意味着,每条数据,都需要根据wm来判断是否触发。 第二是 ,有窗口,意味着,每个窗口,都需要根据wm来判断是否触发。 虽然是两种情况,但是具有共性特征,窗口也有时间,用窗口的endTime代表窗口触发的时间,就和数据触发过程无异了。 聊到了这,就有两个问题需要解答,数据或窗口的时间怎么保存,怎么触发。 阅读详情

相关推荐

24.flink windows 窗口,彻底站起来。

本文的主要目的是学会flink window窗口编程,本文章不会对:滑动窗口,滚动窗口,sessoin窗口作深入的讲解,那不是本文的目的。本文在假设你对窗口有一定了解的基础的前提下,带你看看flink窗口编程。flink 水位线彻底站起来。.........

笔生花的博客 2724

Flink窗口机制

文章目录 (一)窗口分类 (二) 一、窗口分类 键控窗口 和 非键控窗口 时间窗口 和 计数窗口 滑动窗口 和 滚动窗口 会话窗口 根据窗口不同的分类规则,大致可以分为上面几种。从上至下,更加具体。比如,键控窗口和非键控窗口都可以调定义时间窗口和计数窗口;而时间窗口和计数窗口,都可以定义滑动窗口和滚动窗口;另外,在时间窗口中,还有一个特例,就是会话窗口。 二、键控窗口 和 非键控窗口 根据在开窗之前,是否执行了 keyBy() 操作,分为 键控窗口 和 非键控窗口。 顾名思义,键控窗口,

Johnson8702的博客 2050

Flink 多并行度下的水位线触发机制

通过使用WatermarkTracker组件和全局水位线的概念,Flink能够确保所有并行任务都达到或超过全局水位线时才触发下游操作符的处理。水位线触发的基本原则是:只有当所有并行任务的水位线都达到或超过某个阈值时,下游操作符才会触发相应的处理。为了实现多并行度下的水位线触发机制,Flink引入了一个叫做WatermarkTracker的组件。作为水位线生成器,它为每个事件分配了一个时间戳,并在每个事件的时间戳基础上延迟1秒钟生成水位线。最后,我们将水位线和事件打印出来,以验证水位线的生成和推进过程。

VavzNvml的博客 427

Flink的window机制

窗口分为两大类: - 基于时间的窗口 - 时间窗口以时间点到来定义窗口的开始(start)和结束(end),所以截取出的就是某一时间段的数据。到达时间时,窗口不再收集数据,触发计算输出结果,并将窗口关闭销毁 - 窗口大小 = 结束时间 - 开始时间 - 基于元素个数 - 基于元素的个数来截取数据,到达固定的个数时就触发计算并关闭窗口 - 只需指定窗口大小,就可以把数据分配到对应的窗口中

wt334502157的博客 1300

Flink 窗口触发器 Trigger

Flink 窗口触发器(Trigger)决定了窗口何时触发计算。本文介绍了 Trigger 的接口方法(如 onElement、onProcessingTime 等)和返回结果(CONTINUE、FIRE、PURGE 等),并列举了内置触发器(如 EventTimeTrigger、CountTrigger 等)及其适用场景。针对特定需求(如按用户数触发窗口计算),文章还展示了如何通过继承 Trigger 抽象类实现自定义触发器,以统计文章点击次数和平均点击次数。通过状态管理和触发逻辑的结合,可以灵活控制窗口

SmartSi 1287

Flink原理与实现:Window的实现原理

在阅读本文之前,请先阅读Flink 原理与实现:Window机制,这篇文章从用户的角度,对Window做了比较详细的分析,而本文主要是从Flink框架的实现层面,对Window做另一个角度的分析。 首先看一个比较简单的情况,假设我们在一个KeyedStream上做了一个10秒钟的tumbling processing time window,也就是说,每隔10秒钟窗口会触发一次,即: dat......

微信搜:import_bigdata,大数据领域硬核原创作者 1206

Flink学习笔记(十):flink触发器

一、概述 上一篇记录了flink的算子(窗口)的相关信息,那么是否有疑问,定义的窗口时什么时候使用的呢? 大家是否记得窗口有一个 [.trigger(…)] 的而可选项呢? [.trigger(...)] //trigger:指定触发器Trigger(可选) 每个WindowAssigner都带有一个默认触发器,窗口就是通过trigger进行触发操作。 Flink中定义了Trigger抽象类,任何trigger必须继承Trigger类,并实现其中的 onElement() :方法会在窗口中每进入一条

小白的专栏 2016

Flink的Window源码剖析

Window 可以看到,GlobalWindow和TimeWindow均继承自抽象类Window,其源码如下: public abstract class Window { public abstract long maxTimestamp(); } 可以看出,Window抽象类仅有一个maxTimestamp()方法用于获取仍属于该窗口的最大时间戳。 TimeWindow 首先看TimeW...

打酱油的葫芦娃 6194

flink 窗口

window 一般真实的流都是无界的,怎么处理无界的数据? 可以把无限的数据流进行切分,得到有限的数据集进行处理 --也就是得到有界流 窗口就是将无限流切割为有限流的一种方式,它会将流数据分发到有限大小的桶中进行分析 窗口类型 时间窗口(time window) 滚动时间窗口(Tumbling Window) 将数据依据固定的窗口长度对数据进行切分 时间对齐,窗口长度固定,没有重叠,每条数据...

qq_34897849的博客 438

【Flink】Flink窗口触发器

通常来说使用默认的触发器即可,但是有个特殊的使用情景,业务数据不一定是连续进入的,有的时候没有数据就没有水印生成也就没有触发计算,用户没有看到数据,但实际上不需要等到窗口结束才能获取结果,需要不断获取到中间结果,在固定的interval获取到窗口的中间结果。数据进入到窗口的时候,窗口是否触发后续的计算由窗口触发器决定,每种类型的窗口都有对应的窗口触发机制。通过对比 ProcessTime 和窗口结束时间戳确定是否触发窗口,如果 ProcessTime 的时间大于窗口结束时间戳则触发计算,反之不触发计算。

一杯咖啡半杯糖的博客 1543

操作系统笔记(含王道计算机考研——操作系统课件)

操作系统(OS) 笔记根据B站王道计算机考研——操作系统视频整理所得,视频链接:https://b23.tv/0I2qex 视频中所用课件:链接:https://pan.baidu.com/s/101bFWm0Tv0emNpEneidYPA 提取码:y3dd 1.计算机系统概述 1.简介 什么是操作系统? 操作系统(Operating Ststem, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是

拧发条鸟的博客 6万+

Flink(二)窗口机制

Flink窗口机制是流式数据处理的核心组件,主要解决无界数据流的分段统计问题。文章系统介绍了窗口的分类(滚动/滑动/会话/计数窗口)、时间语义(事件/处理/摄取时间)及实现原理。详细阐述了窗口的五个关键组件:分组、窗口分配器、触发器、移除器和窗口函数,并提供了Java API示例。同时讲解了窗口生命周期、状态存储优化策略(如RocksDBStateBackend)和高级特性(迟数据处理、侧输出流)。最后指出窗口大小、水位线设置等注意事项,强调Flink通过分布式状态管理和增量计算实现高效窗口处理。

onlymscn的博客 1525

基-2 16点fft的verilog实现

本文是采用输入8位数据,输出8位数据的16点fft实现,旋转因子采用8位rom存储,分为cos和sin2个rom存储;输入数据以及每一级的输出数据采用8位的ram进行存储,分为实部和虚部进行存储。采用顺序输入,那么输出则为倒序。生成rom,可先在matlab中,计算出cos和sin的值,然后写入coe文件,再由ip核生成,具体过程自行百度,懒得百度的话,可以发我的邮箱来获得具体的程序。因为本文采用...

juniorofMFC的博客 9992

【4.1】flink窗口算子的trigger触发器和Evictor清理器

【README】 本文记录了 窗口算子的触发器trigger和 evictor清理器; trigger触发器:决定了一个窗口(由 window assigner 定义)何时可以被 window function 处理; evictor清理器: evictor 可以在 trigger 触发后、调用窗口函数之前或之后从窗口中删除元素; 【1】触发器trigger 1)Trigger 接口提供了五个方法来响应不同的事件: onElement() 方法在每个元素被加入窗口时调用。 onEventTime

PacosonSWJTU的博客 3275

从入门到精通:dirmap 高级 Web 目录扫描实战指南

本文提供了一份从环境搭建到高级配置的dirmap Web目录扫描实战指南。详细解析了工具安装、核心配置文件dirmap.conf的深度调优,包括递归扫描、四种扫描模式(字典、爆破、爬虫、Fuzz)的实战应用,并演示了分阶段资产发现的完整工作流程,帮助安全人员高效发现隐藏目录与敏感文件。

rnn9storyteller的博客 482

爬取中国空气质量在线监测分析平台

1.准备,爬取的链接地址 https://www.aqistudy.cn/html/city_detail.html 2.分析 a.当打开链接后,数据已经设置好了,说明里面大部分都是js通过ajax调用的, b.打开f12分析代码 通过捕获到的数据包,发现当前请求为ajax,携带着一个为d的参数且该请求携带的数据是加密过的,并且响应也是加密过的 c.这时候的问题就是...

Mr Right 6374

触发器(Trigger)

触发器(Trigger)

weixin_45538732的博客 1300

西门子 S7-200 SMART 系列六:手把手教你配置S7-200 SMART Modbus RTU

最新发表:https://www.ics-pedia.com/%e8%a5%bf%e9%97%a8%e5%ad%90-s7-200-smart-%e7%b3%bb%e5%88%97%e5%85%ad%ef%bc%9a%e6%89%8b%e6%8a%8a%e6%89%8b%e6%95%99%e4%bd%a0%e9%85%8d%e7%bd%aes7-200-smart-modbus-rtu%e5%ae%9e%e4%be%8b/

John_09040211的博客 3283

一文搞懂Flink 窗口设计深入详解(含源码分析)

窗口(Window)是处理无界流的核心机制,将无限的数据流切分为有限的"桶"(bucket),在每个桶上执行计算。无界流数据: ———[1]———[2]———[3]———[4]———[5]———[6]———[7]———→↓ ↓ ↓ ↓滚动窗口: [1,2,3] [4,5,6] [7,8,9] [10,11,12]窗口分配器(Window Assigner):决定数据分配到哪个窗口触发器(Trigger):决定何时触发窗口计算驱逐器(Evictor):决定哪些数据从窗口移除(可选)

mn_kw的博客 841

AWR2243的等效相位中心与虚拟通道

在俯仰维方向上,不重合的虚拟通道有8个,排序为1:4,9:12。每个虚拟阵元之间的间隔为lambda/2。实际y轴方向虚拟阵列只跨越了8*lambda/2的距离。等效相位中心与虚拟通道类似,只是每个相位中心之间间隔为lambda/4,实际y轴方向等效相位中心只跨越了8*lambda/4=7.59mm的距离

qq_50974341的博客 1983

TensorRT量化校准数据集选择

在TensorRT中进行INT8量化时,校准数据集的选择至关重要,直接影响量化后模型的精度和推理性能。这是一个典型的问题。

浩瀚之水的专栏 499

Flink窗口机制解析与实践指南

流式计算中的窗口机制是处理无界数据流的核心技术,通过将连续数据划分为有限块实现有状态计算。其原理基于时间或数量维度对数据进行分段,支持滚动、滑动、会话等窗口类型,在实时统计、监控告警等场景发挥关键作用。Apache Flink作为主流流处理框架,提供了完整的窗口API实现,包括窗口分配器、触发器和驱逐器等核心组件。在实际工程中,需要根据业务特点选择合适的时间语义,处理迟到数据,并优化状态管理。典型应用如电商实时销售额统计、物联网设备监控等场景,通过合理配置窗口大小和触发策略,可平衡计算精度与系统开销。随着流

weixin_30225755的博客 172

ARM 之十六 详解 CMSIS 版本变迁、各组件使用示例

目前,CMSIS 已经发展到了第六版,其目录结构也发生了重大的变化。在不断发展中,很多原来 CMSIS 的组件被不断独立出去,并因此成立了很多开源社区,今天就来学习一下!由于 CMSIS 已经包含了相当丰富的文档,因此,本文重点学习版本之间的变化以及一些实际使用示例。

技术干货 1956

Flink自定义窗口触发器

Flink内置触发器及自定义窗口触发器 flink: 1.10.1 Github: https://github.com/shirukai/flink-examples-trigger.git 前段时间同事开发遇到一个需求,要求按照事件时间10分钟窗口计数,同时需要有新数据时每分钟输出一次结果。窗口计数非常简单,设置一个窗口,然后运用一个聚合函数就可以解决了。但是有新数据时每分钟输出一次结果,好像实现起来并不容易,因为按照平时的窗口,设置10分钟之后,要等到watermark超过了当前的窗口之后,才会被

shirukai 5752

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Flink 窗口触发器Triggers

实现一个CountTrigger 窗口元素数量达到阈值时,触发计算@Overridecount++;// 触发窗口并清除计数器count = 0;@Override@Override// 其他方法(onEventTime, onProcessingTime, onMerge, clear)可以留空或实现特定的逻辑@Overridecount = 0L;// 应用全局窗口和自定义触发器。

happycao123的博客 1162

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Flink 窗口触发器(Trigger)(二)

用户可以通过实现 Trigger 接口来创建自定义触发器。自定义触发器可以基于复杂的逻辑来决定何时触发窗口的计算。onElement(element, timestamp, window, ctx): 当元素被添加到窗口时调用。(time, window, ctx, out): 当窗口的事件时间到达时调用。(time, window, ctx, out): 当窗口的处理时间到达时调用。onMerge(other): 当两个窗口合并时调用(例如,在会话窗口中使用)。canMerge。

王小工小工历程 2438

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: Flink窗口类型及使用详解
下一篇: Spark SQL优化方案总结
走过冬季
博客等级 码龄9年 1609粉丝 341原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走过冬季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值