Flink入门(五)--Flink算子

Map 


DataStream → DataStream 

一个接受一个元素并产生一个元素的函数。

示例

dataStream.map { x => x * 2 }


FlatMap 


DataStream → DataStream 

一个接受一个元素并产生零个、一个或多个元素的函数。

例如

dataStream.flatMap { str => str.split(" ") }


Filter 


DataStream → DataStream 

对于每个元素,设定一个布尔函数,并保留那些使函数返回true的元素。

例如 

dataStream.filter { _ != 0 }


KeyBy 


DataStream → KeyedStream 

逻辑上将流划分为不相交的分区。所有具有相同键的记录都被分配到同一个分区中。在内部,keyBy() 是通过哈希分区来实现的。指定键的方式有多种。

注意:没有实现hashcode()方法的POJO类和任何类型的数组都无法作为Key!!!

Reduce

KeyedStream → WindowedStream

该操作会连续地将当前元素与上一个reduce操作的结果(即最后一个reduced值)进行合并,并发出新的合并后的值。这种操作通常用于计算流数据的累积或滚动汇总。

 例如

keyedStream.reduce { _ + _ }

Window 


KeyedStream → WindowedStream 

在已经分区的KeyedStreams上可以定义窗口。窗口根据某些特性(例如,在过去5秒内到达的数据)将每个键中的数据分组。

例如 

dataStream.keyBy(_._1).window(TumblingEventTimeWindows.of(Time.seconds(5)))

对于窗口有关的知识点可以参考我的另一篇博文

Flink入门(四) -- Flink中的窗口_flink 窗口概念 使用场景-CSDN博客

WindowAll 


DataStream → AllWindowedStream

窗口可以在常规数据流(DataStream)上定义。窗口会根据某些特性(例如,在过去5秒内到达的数据)将所有流事件进行分组。

 例如

dataStream.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))

Tips:在许多情况下,这是一个非并行转换。对于windowAll操作符,所有记录都将被收集到一个任务中。

Window和WindowAll的异同

特性WindowwindowAll
应用场景适用于已经分区的KeyedStream,对分区内的数据进行窗口化处理适用于未分区的DataStream,将所有流事件作为一个整体进行窗口化处理
并行度并行度是任意的,取决于后续算子的配置和KeyedStream的分区数量并行度固定为1,所有数据都被聚合到一个任务上进行处理
性能影响由于可以并行处理多个分区的数据,通常具有较好的性能由于所有数据都被聚合到一个任务上,当数据量较大时可能导致性能瓶颈
使用场景举例统计每个用户的最近5分钟内的活跃次数等需要按key分别处理的场景统计整个系统的总活跃用户数等需要对全局数据进行统计的场景,但需注意性能问题
窗口分配器与函数需要结合窗口分配器(WindowAssigner)和窗口函数(WindowFunction)来定义具体的窗口操作同样需要结合窗口分配器和窗口函数来定义窗口操作
灵活性灵活性较高,可以根据不同的key进行分区和窗口化处理灵活性较低,因为所有数据都被视为一个整体进行处理

 Window Apply

WindowedStream → DataStream

Window Apply 是一个操作,它允许你应用一个函数到整个窗口上。这意味着你可以定义一个自定义函数来处理窗口内的所有元素,而不是仅仅对每个元素进行独立的操作。这个操作的结果是产生一个新的 DataStream,其中包含了函数处理每个窗口后的结果。

 例如

windowedStream.apply { WindowFunction }// applying an AllWindowFunction on non-keyed window stream
allWindowedStream.apply { AllWindowFunction }

 Union

与sql中union类似

DataStream* → DataStream

两个或多个数据流的联合操作会创建一个新的数据流,该数据流包含所有原始数据流中的所有元素。需要注意的是,如果你将一个数据流与自身进行联合,那么在结果数据流中,每个元素将会出现两次。(不去重不排序)

Join 

Join two data streams on a given key and a common window.

dataStream.join(otherStream).where(<key selector>).equalTo(<key selector>).window(TumblingEventTimeWindows.of(Time.seconds(3))).apply { ... }

Interval Join

KeyedStream,KeyedStream → DataStream

例如

假设你有两个数据流:

订单流(Order Stream):包含订单的详细信息,每个订单都有一个唯一的订单ID、用户ID、订单时间戳(下单时间)和订单金额等。
支付流(Payment Stream):包含支付的详细信息,每个支付都有一个唯一的支付ID、对应的订单ID、支付时间戳和支付金额等。

你的任务是分析订单的支付情况,包括支付是否及时(例如,是否在订单下单后的几分钟内完成支付)。这里,intervalJoin 就可以派上用场了。

// this will join the two streams so that
// key1 == key2 && leftTs - 2 < rightTs < leftTs + 2
keyedStream.intervalJoin(otherKeyedStream).between(Time.milliseconds(0), Time.milliseconds(20000)) // lower and upper bound.upperBoundExclusive(true) // optional.lowerBoundExclusive(true) // optional.process(new IntervalJoinFunction() {...})

partition

  • 自定义分区

  • DataStream→DataStream 使用用户定义的分区程序为每个数据元选择目标任务。

dataStream.partitionCustom(partitioner, "someKey");
dataStream.partitionCustom(partitioner, 0);
  • 随机分区

  • DataStream→DataStream 根据均匀分布随机分配数据元。

dataStream.shuffle();
  • Rebalance (循环分区)

  • DataStream→DataStream 分区数据元循环,每个分区创建相等的负载。在存在数据倾斜时用于性能优化。

dataStream.rebalance();

   · rescaling

元素以轮询方式分区到下游操作的一个子集。这在您希望拥有这样的管道时非常有用,例如,从源的每个并行实例分发到几个映射器的子集以分散负载,但又不想触发rebalance()方法所带来的全面重新平衡。这取决于其他配置值(如TaskManager的插槽数),可能只需要本地数据传输,而不需要通过网络传输数据。

上游操作发送元素的下游操作子集取决于上游和下游操作的并行度。例如,如果上游操作有2个并行度,而下游操作有6个并行度,那么一个上游操作会将元素分发到三个下游操作,而另一个上游操作会将元素分发到另外三个下游操作。另一方面,如果下游操作有2个并行度,而上游操作有6个并行度,那么三个上游操作会将元素分发到一个下游操作,而另外三个上游操作会将元素分发到另一个下游操作。

在不同并行度不是彼此倍数的情况下,一个或多个下游操作将从上游操作接收到不同数量的输入。

dataStream.rescale()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408053.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

besier打断和升阶,高阶性质

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 问题描述 对besier曲线在u处打断&#xff0c;生成两条besier曲线对besier曲线升阶处理 bezier高阶性质 求导推导 P ( t ) ∑ i 0 n B i n ( t ) b i \boldsymbol …

Python 爬虫入门(十二):正则表达式「详细介绍」

Python 爬虫入门&#xff08;十二&#xff09;&#xff1a;正则表达式 前言一、正则表达式的用途二、正则表达式的基本组成元素2.1 特殊字符2.2 量词2.3 位置锚点2.4 断言2.5 字符集2.6 字符类2.6.1 基本字符类2.6.2 常见字符类简写2.6.3 POSIX字符类2.6.4 组合使用 三、 正则表…

Datawhale X 李宏毅苹果书 AI夏令营 学习笔记(二)

自适应学习率 我们梯度下降在参数更新上&#xff0c;公式是 W t W t − 1 − η g t &#xff0c; η 是学习率&#xff0c; g t 是梯度 W_tW_{t-1}-\eta g_t&#xff0c;\eta是学习率&#xff0c;g_t是梯度 Wt​Wt−1​−ηgt​&#xff0c;η是学习率&#xff0c;gt​是梯度…

03_React 收集表单数据和 组件生命周期

React 收集表单数据和 组件生命周期 一、收集表单数据1、例子1.1 需求&#xff1a;定义一个包含表单的组件&#xff0c;输入用户名密码后&#xff0c;点击登录提示输入信息 2、理解&#xff1a;包含表单的组件分类2.1 受控组件2.2 非受控组件 二、高阶函数\_函数柯里化1、复习-…

9 正则表达式:Java爬虫和正则表达式、String中的正则表达式方法(基本语法7)

文章目录 前言一、正则表达式1 [ ] 语法(1)[ABC] 和 [^ABC](2)[A-Z]和[a-zA-Z]小总结2 特殊字符语法(\w 这些)3 数量符4 \ 、()、 |5 锚点 ^ 和 $,\b,\B6 (?i) : 忽略其后面的大小写 ---- 这个Java是可以的,其他语言我不知道(正则表达式虽然大多通用,但也有部分是…

zabbix5.0与7.0版本区别 切换建议

Zabbix5.0和Zabbix7.0的区别 1. 性能和扩展性优化 1.1 高效的数据处理和存储 优化的数据库性能&#xff1a; Zabbix 7.0 在数据库层面进行了多项优化&#xff0c;以减少查询延迟和提高数据处理速度。这包括对数据库结构的改进和索引优化&#xff0c;使得大规模数据的读取和写…

Spark-driver和executor启动过程

一、上下文 《Spark-SparkSubmit详细过程》详细分析了从脚本提交任务后driver是如何调用到自己编写的Spark代码的&#xff0c;而我们的Spark代码在运行前必须准备好分布式资源&#xff0c;接下来我们就分析下资源是如何分配的 二、Spark代码示例 我们以一个简单的WordCount程…

打卡学习Python爬虫第五天|Xpath解析的使用

什么是Xpath&#xff1f;是在XML文档中搜索内容的一门语言&#xff0c;HTML可以看作是xml的一个子集。 目录 1、安装lxml模块 2、导入lxml中的etree子模块 3、Xpath使用方法 3.1.选择节点 3.2.选择属性 3.3.选择文本内容 3.4.使用通配符*过滤节点 3.5.使用中括号[]索引…

Java学习_20_File以及IO流

文章目录 前言一、FileFile中常见的成员方法判断和获取创建和删除获取和遍历 二、IO流IO流体系结构字节流字节输出流&#xff1a;FileOutputStream字节输入流FileInputStrea文件拷贝try……catch异常处理中文乱码现象 字符流字符流读取FileReader字符流输出FileWriter底层原理 …

Linux 命令集合

1. linux 系统版本 1.1 linux系统的分类 linux系统&#xff0c;主要分Debian系和RedHat系&#xff0c;还有其它自由的发布版本。 1、Debian系主要有Debian&#xff0c;Ubuntu&#xff0c;Mint等及其衍生版本&#xff1b; 2、RedHat系主要有RedHat&#xff0c;Fedora&#xf…

Springsecurity 自定义AuthenticationManager

一、认证流程 1、当用户提交了一个他的凭证(用户名、密码) AbstractAuthenticationProcessingFilter 将会创建一个凭证信息&#xff0c;最终&#xff0c;该请求会被UsernamePasswordAuthenticationFilter 拦截将请求中用户名和密码&#xff0c;封装为 Authentication 对象&…

C++ | Leetcode C++题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canMeasureWater(int x, int y, int z) {if (x y < z) {return false;}if (x 0 || y 0) {return z 0 || x y z;}return z % gcd(x, y) 0;} };

AI大模型进化之路:机器学习九大算法画图详解

机器学习算法对于了解AI大模型的意义非常重要&#xff0c;它们是构建、训练和应用AI大模型的基础和关键。今天给大家整理了一份机器学习核心算法资料&#xff0c;建议收藏学习。 集成学习是一种机器学习算法&#xff0c;它通过构建多个模型并整合它们的预测结果来提高性能。常…

ST 表算法

ST 表 ST 表&#xff0c;主要思想是空间换时间&#xff0c;用于解决可重复贡献问题和 RMQ 问题。 可重复贡献问题 指某个运算 o p op op&#xff0c;有 x o p x x x\ op\ x\ \ x x op x x 。例如 m a x ( x , x ) x m i n ( x , x ) x g c d ( x , x ) x max(x,x)x\…

【Docker】Docker学习01 | 什么是docker?

本文首发于 ❄️慕雪的寒舍 因为本人没有学习过docker&#xff0c;虽然部署过很多镜像&#xff0c;但是对于docker底层的实现一概不知。趁学习一个新项目的契机&#xff0c;将docker的相关概念了解清楚。 安装docker的教程请查看 Linux主机安装docker。 如果你想和我一起学习do…

TCP的连接建立及报文段首部格式

粘包问题&#xff1a; 原因&#xff1a;TCP流式套接字&#xff1b;数据与数据之间没有边界&#xff1b;导致可能多次的数据粘到一起。 解决办法&#xff1a; 规定一些数据与数据之间的间隔符&#xff0c;如&#xff1a;"\aa\", "\r\n"。指定要发送的数据…

exec函数簇

一、main 函数的参数定义 在C语言中&#xff0c;main 函数是程序执行的入口点。main 函数可以接受参数&#xff0c;这些参数通常用于从命令行接收输入。main 函数的参数定义通常遵循以下形式&#xff1a; int main(int argc, char *argv[]) 或者等价地&#xff1a; int mai…

91. UE5 RPG 实现拖拽装配技能以及解除委托的绑定

在上一篇文章里&#xff0c;实现了通过选中技能&#xff0c;然后点击下方的装备技能插槽实现了技能的装配。为了丰富技能装配功能&#xff0c;在这一篇里&#xff0c;我们实现一下通过拖拽技能&#xff0c;实现拖拽功能&#xff0c;我们需要修改两个用户控件&#xff0c;一个就…

杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC

通过公式计算 * 波特率和采样点计算公式&#xff1a;* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…

文件IO和多路复用IO

目录 前言 一、文件 I/O 1.基本文件 I/O 操作 1.1打开文件 1.2读取文件内容 (read) 1.3写入文件 (write) 1.4关闭文件 (close) 2.文件指针 二、多路复用 I/O 1.常用的多路复用 I/O 模型 1.1select 1.2poll 1.3epoll 2.使用 select、poll 和 epoll 进行简单的 I/O…