DataStream API(转换算子)

目录

源算子

转换算子

1,基本转换算子

1.1映射(map)

1.2过滤(filter)

1.3扁平映射(flatMap)

2,聚合算子

2.1按键分区(keyBy)

2.2简单聚合

3,用户自定义函数

3.1.函数类(Function Classes)

3.2 富函数类(Rich Function Classes)

4,物理分区

输出算子


源算子

源算子

转换算子

1,基本转换算子

1.1映射(map

        Map() 是大数据处理中常用的一个算子,主要用于转换数据流中的数据,生成新的数据流。这个操作可以看作是一种“一一映射”,即对输入数据流中的每个元素进行处理,并产生一个相应的输出元素。在处理大量数据时,Map() 算子能够帮助我们将复杂的数据转换成易于处理或符合特定需求的格式。通过定义一个函数或Lambda表达式,我们可以指定如何对输入数据进行转换。Map() 算子在处理数据流时非常灵活,可以应用于各种场景,如数据清洗、格式转换、特征提取等。

1.2过滤(filter

        Filter() 转换操作是对数据流执行过滤的过程,根据指定的布尔条件表达式来设置过滤条件。对于流中的每个元素,Filter() 算子会根据条件进行判断:如果条件为真(true),则元素正常输出;如果条件为假(false),则元素被过滤掉。这种过滤操作在大数据处理中非常有用,可以用于筛选出符合特定条件的数据,或者去除不符合要求的数据。通过 Filter() 算子,我们可以实现对数据流的筛选、去重、降噪等操作,从而更好地处理和分析数据。与 Map() 算子一样,Filter() 算子也提供了很大的灵活性,可以根据具体需求自定义过滤条件。在 Flink 中,我们可以通过实现一个函数或 Lambda 表达式来定义过滤条件,从而实现数据的筛选操作。

1.3扁平映射(flatMap

        FlatMap() 操作又称为扁平映射,主要用于将数据流中的整体(通常是集合类型)拆分成单个个体。与 Map() 算子不同,FlatMap() 可以产生 0 到多个元素,意味着对于输入数据流中的每个元素,FlatMap() 可以根据定义的处理逻辑生成一个或多个输出元素。这种操作在大数据处理中非常有用,特别是在需要对集合类型数据进行拆分和转换的场景中。

        FlatMap() 可以被视为“扁平化”(flatten)和“映射”(map)两个操作的结合。具体来说,它首先按照某种规则将数据进行打散拆分,然后将拆分后的元素进行转换处理。这种操作在数据流处理中提供了一种有效的机制,用于处理复杂的转换逻辑,特别是需要将集合类型数据拆分成单个元素进行处理的情况。

2,聚合算子

2.1按键分区(keyBy

        在 Flink 中,DataStream API 本身不直接提供聚合操作。对海量数据进行聚合时,为了提高效率,我们需要进行分区并行处理。因此,在 Flink 中进行聚合之前,通常需要先进行分区操作。这个分区操作是通过 keyBy() 算子完成的。

        keyBy() 算子在聚合操作中起着至关重要的作用。通过指定键(key),它可以将一条数据流逻辑上划分成不同的分区(partitions)。这些分区实际上是并行处理的子任务,每个分区对应一个任务槽(task slot)。

        当使用不同的键时,流中的数据将被分配到不同的分区中。这样一来,所有具有相同键的数据都会被发送到同一个分区,从而确保后续的算子操作在同一个任务槽中执行。这种分区机制确保了相同键的数据能够被集中处理,提高了聚合操作的效率。

        在内部,keyBy() 算子通过计算键的哈希值并对分区数进行取模运算来实现数据的分区。因此,如果键是一个 POJO 类,必须重写其 hashCode() 方法以确保正确的哈希计算。

        在具体使用时,keyBy() 方法需要传入一个参数,这个参数可以是一个或一组键。有多种方式指定键:对于 Tuple 数据类型,可以指定字段的位置或多个位置的组合;对于 POJO 类型或 Scala 的样例类,可以指定字段的名称(String);此外,还可以使用 Lambda 表达式或实现一个键选择器(KeySelector)来描述从数据中提取键的逻辑。

        通过合理使用 keyBy() 算子,开发者能够有效地对数据进行分区处理,从而实现高效的聚合操作。这为处理大规模数据流提供了强有力的支持,并确保了 Flink 流处理的灵活性和可扩展性。

2.2简单聚合

        在拥有按键分区的 KeyedStream 数据流后,我们就可以基于它进行聚合操作了。Flink 为我们提供了一些内置的基本和简单聚合 API,主要包括以下几种:

  1. sum():在输入流上,对指定的字段执行叠加求和操作。
  2. min():在输入流上,对指定的字段求最小值。
  3. max():在输入流上,对指定的字段求最大值。
  4. minBy():与 min() 类似,但在输入流上针对指定字段求最小值。不同的是,min() 只计算指定字段的最小值,而其他字段会保留最初第一个数据的值;而 minBy() 会返回包含字段最小值的整条数据。
  5. maxBy():与 max() 类似,在输入流上针对指定字段求最大值。与 min()/minBy() 的区别相同。

        这些聚合算子使用起来非常方便,语义也非常明确。调用这些聚合方法时,需要传入参数,但不像基本转换算子那样需要实现自定义函数。只要指定聚合指定的字段即可。字段的指定有两种方式:通过位置或通过名称。

        对于元组类型的数据,同样可以使用这两种方式来指定字段。需要注意的是,元组中的字段名称是以 _1、_2、_3 等来命名的。

        通过这些聚合算子,我们可以轻松地对按键分区的数据进行聚合操作,从而快速获得所需的数据摘要或统计信息。                

3,用户自定义函数

        在 Apache Flink 的 DataStream API 中,编程风格确实是一致的。基于 DataStream 的转换操作主要通过一系列的方法调用实现,每个方法都对应一个特定的算子操作。这些方法通常需要传入一个参数,这个参数是一个实现了特定接口的对象。

        这些接口都遵循一个统一的命名规范,即以算子操作名称 + Function 结尾,如 SourceFunction、MapFunction、ReduceFunction 等。这种命名约定有助于开发者快速识别接口的用途。

用户可以通过多种方式实现这些接口:

3.1.函数类(Function Classes

        在处理流数据时,大部分操作都需要使用到用户自定义函数(UDF)。这些函数通过实现特定的接口,如 MapFunction、FilterFunction、ReduceFunction 等,来定义数据的处理逻辑。

3.2 富函数类(Rich Function Classes

        富函数类是 DataStream API 提供的一种特殊的函数类接口,它们都有一个 Rich 版本。与常规函数类相比,富函数类提供了更多的功能和更大的灵活性。

        首先,所有的 Flink 函数类都有其 Rich 版本,如 RichMapFunction、RichFilterFunction、RichReduceFunction 等。这些富函数类通常以抽象类的形式出现,为开发者提供了一个基类,用于实现更复杂的功能。

        与常规函数类的主要区别在于,富函数类可以获取运行环境的上下文,并拥有一些生命周期方法。这使得它们能够实现更高级的功能,比如获取执行环境的信息、访问外部资源或执行更复杂的初始化操作。

以下是生命周期方法的一些关键点:

  1. open()方法:这是 Rich Function 的初始化方法,标志着算子生命周期的开始。在算子的实际工作方法(如 map() 或 filter())被调用之前,open() 方法会被首先调用。因此,一次性工作,如文件 IO 流的创建、数据库连接的建立或配置文件的读取等,都适合在 open() 方法中完成。
  2. close()方法:这是生命周期中的最后一个方法,类似于对象的解构方法。它通常用于执行清理工作,例如释放资源或关闭打开的连接。

需要注意的是,对于一个并行子任务来说,生命周期方法只会调用一次;而实际的工作方法(如 RichMapFunction 中的 map()),则在每条数据到达时都会被触发一次调用。

通过使用富函数类,开发者可以更好地控制数据处理过程中的行为和资源管理,从而实现更高效和灵活的数据处理任务。

4,物理分区

        分区操作在数据处理中是一个核心概念,它涉及到将数据重新分配到不同的子集或分区,以便进行更高效或更有针对性的处理。分区操作通常用于流处理和批处理系统,以提高数据处理的速度和效率。

        在 Apache Flink 这样的流处理框架中,"keyBy()" 方法是一个逻辑分区操作。逻辑分区主要是基于某个或某些键值(key)对数据进行分组,以便于进行聚合、窗口操作等后续计算。

        然而,仅仅通过逻辑分区可能并不足以满足所有的数据处理需求。因此,Flink 提供了一系列物理分区操作算子,用于在数据流经过转换操作之后,进行更细致和特定的分区。这些物理分区操作主要包括: 

        1,随机分区:将数据随机分配到不同的分区,以达到负载均衡的目的。

        2,轮询分区:按照固定的顺序将数据分配到不同的分区,通常用于保证数据的顺序性。 

        3,重缩放分区:根据数据的分布情况动态调整分区的数量,以实现更好的负载均衡。   

        4,广播:将数据同时发送到所有分区,主要用于全局状态的管理或同步。

        5,全局分区:将所有数据分配到一个分区中,通常用于全局聚合或统计。 

此外,Flink 还支持用户自定义分区策略,以满足特定的业务需求。用户可以根据自己的数据特性和处理逻辑,编写自定义的分区函数,以实现更精细的数据处理逻辑。

分区操作在流处理中起着至关重要的作用,通过合理的分区策略和操作,可以提高数据处理的效率、准确性和响应速度。

输出算子

输出算子

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024-01-24(ElasticSearch)

1.mysql和elasticsearch的架构: 2.IK分词器利于分中文词汇。 底层是有一个中文字典,这个字典中的中文词汇也是可以拓展的和禁用某些词。 3.mapping常见属性: type:数据类型 index:是否索引 analyzer:分…

2024年mongodb自建三节点副本集详细教程

环境说明 系统centos7.9 自建服务器或云服务器,硬件要求不低于2核2G内存,20G硬盘,文件系统默认是ext4即可。 生产环境最好单独一个磁盘存放数据库,方便数据备份和还原,避免干扰到其他磁盘的运作。 mongodb 4.4.27 …

QT 实现自动生成小学两位数加减法算式

小学生加减法训练 QT实现–自动生成两位数加减法算式,并输出txt文件 可以copy到word文件,设置适当字体大小和行间距,带回家给娃做做题 void MainWindow::test(int answerMax, int count) {// 创建一个随机数生成器QRandomGenerator *gener…

引领AI变革:边缘计算与自然语言处理结合的无尽可能

引言 讲到Ai,你第一时间会想到什么?是Chagpt和文心一言这样与人类交流自然的Ai生成式对话服务?还是根据关键字快速制图的Ai绘图?这些都是近年来人们所常知的Ai用途,我们今天来讲讲以自然语言处理为辅,在Ai赋…

JS之歌词滚动案例

让我为大家带来一个歌词滚动的案例吧&#xff01; 详细的介绍都在代码块中 我很希望大家可以自己动手尝试一下&#xff0c;如果需要晴天的mp3音频文件可以私信我 上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

Vue好看的组件库:Element

文章目录 1、什么是Element2、Element快速入门3、Element布局3.1、 Layout 局部3.2、容器布局 1、什么是Element Element&#xff1a;是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库&#xff0c;用于快速构建网页 Element 提供了很多组件&#xff08;组成网页的部件…

使用DBSyncer同步Oracle11g数据到Mysql5.7中_实现全量数据同步和增量数据实时同步_操作过程---数据同步之DBSyncer工作笔记007

之前都是用mysql和Postgresql之间进行同步的,已经实现了数据的实时同步,现在要实现Oracle数据库到Mysql数据库的全量,以及增量同步. 因为之前配置的不对,这里架构名写成了orcl,所以导致,虽然能连接上,但是,在进行数据同步的时候,看不到表,所以这里说一下如何进行连接 这里,首先…

全球机器人产业:技术创新驱动下的市场与竞争新态势

原创 | 文 BFT机器人 近年来&#xff0c;随着颠覆性技术创新的不断涌现、市场新需求的迅速崛起以及外部冲击的深远影响&#xff0c;机器人产业正经历着前所未有的变革。在技术领域&#xff0c;机器人技术不断突破&#xff0c;智能化、自主化、协同化水平日益提升&#xff1b;在…

Java设计模式-装饰器模式(10)

大家好,我是馆长!今天开始我们讲的是结构型模式中的装饰器模式。老规矩,讲解之前再次熟悉下结构型模式包含:代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式、组合模式,共7种设计模式。。 装饰器模式(Decorator Pattern) 定义 装饰(Decorator)模式…

前端开发如何自己开发组件库

好多前端小伙伴干了五六年&#xff0c;一直在做切图仔&#xff0c;一看项目没啥亮点。今天开始&#xff0c;我就分享下自己开发组件库的历程。 注&#xff1a;文章会持续更新 环境 "dumi": "^2.2.0","father": "^4.1.0",这里我们站在巨…

消息中间件之八股面试回答篇:一、问题概览+MQ的应用场景+RabbitMQ如何保证消息不丢失(生产者确认机制、持久化、消费者确认机制)+回答模板

问题概览 目前主流的消息队列技术&#xff08;MQ技术&#xff09;分为RabbitMQ和Kafka&#xff0c;其中深蓝色为只要是MQ&#xff0c;一般都会问到的问题。浅蓝色是针对RabbitMQ的特性的问题。蓝紫色为针对Kafka的特性的问题。 MQ的应用场景 MQ主要提供的功能为&#xff1a;异…

Database history tablesupgraded

zabbix升级到6之后&#xff0c;配置安装完成会有一个红色输出&#xff0c;但是不影响zabbix使用&#xff0c;出于强迫症&#xff0c;找到了该问题的解决方法。 Database history tables upgraded: No. Support for the old numeric type is deprecated. Please upgrade to nume…

【新课上架】安装部署系列Ⅲ—Oracle 19c Data Guard部署之两节点RAC部署实战

01 课程介绍 Oracle Real Application Clusters (RAC) 是一种跨多个节点分布数据库的企业级解决方案。它使组织能够通过实现容错和负载平衡来提高可用性和可扩展性&#xff0c;同时提高性能。本课程基于当前主流版本Oracle 19cOEL7.9解析如何搭建2节点RAC对1节点单机的DATA GU…

LLM之RAG实战(二十一)| 使用LlamaIndex的Text2SQL和RAG的功能分析产品评论

亚马逊和沃尔玛等电子商务平台上每天都有大量的产品评论&#xff0c;这些评论是反映消费者对产品情绪的关键接触点。但是&#xff0c;企业如何从庞大的数据库获得有意义的见解&#xff1f; 我们可以使用LlamaIndex将SQL与RAG&#xff08;Retrieval Augmented Generation&#x…

中国县域统计年鉴,含县市卷和乡镇卷,时间覆盖2001-2022年

数据名称: 中国县域统计年鉴 数据格式: pdf、xls不定 数据时间: 2001-2022年 数据几何类型: 文本 数据坐标系: —— 数据来源&#xff1a;国家统计局 数据字段: 中国县域统计年鉴&#xff08;县市卷&#xff09;中国县域统计年鉴&#xff08;乡镇卷&#xff09;目录…

Unity - 将项目转为HDRP

Camera window -> Package Manager 之后会出现HDRP向导窗口&#xff0c;均点击修复。 在Edit中&#xff0c;更改项目中的材质

科技发展趋势,墨水屏电子桌牌将发挥更重要作用

随着科技的不断发展&#xff0c;电子桌牌作为信息展示和宣传的新型设备&#xff0c;逐渐在各个行业得到广泛应用。在国企单位、政府部门、大企业、外企等&#xff0c;墨水屏电子桌牌作为一种新型的数字化展示工具&#xff0c;也已经得到了越来越多的应用。下面&#xff0c;中科…

【Leetcode】2865. 美丽塔 I

文章目录 题目思路代码结果 题目 题目链接 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&#xff0c;我们称这些塔是 美丽 的&#xff1a; 1 < hei…

【前端web入门第一天】02 HTML图片标签 超链接标签

文章目录: 1.HTML图片标签 1.1 图像标签-基本使用1.2 图像标签-属性1.3 路径 1.3.1 相对路径 1.3.2 绝对路径 2.超链接标签 3.音频标签 4.视频标签 1.HTML图片标签 1.1 图像标签-基本使用 作用:在网页中插入图片。 <img src"图片的URL">src用于指定图像…

支持向量机(SVM)详解

支持向量机&#xff08;support vector machines&#xff0c;SVM&#xff09;是一种二分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器&#xff0c;间隔最大使它有别于感知机。 1、线性可分支持向量机与硬间隔最大化 1.1、线性可分支持向量机 考虑一个二分…