Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Flink 的数据流算子

Flink 的数据流算子

作者头像
前Thoughtworks-杨焱
发布于 2021-12-07 08:05:15
发布于 2021-12-07 08:05:15
47600
代码可运行
举报
文章被收录于专栏:杨焱的专栏杨焱的专栏
运行总次数:0
代码可运行

Map

输入DataStream返回DataStream。

接收一个元素,产生一个元素。下面是转换为双倍值的MapFunction

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DataStream<Integer> dataStream = //...
dataStream.map(new MapFunction<Integer, Integer>() {
    @Override
    public Integer map(Integer value) throws Exception {
        return 2 * value;
    }
});

FlatMap

输入DataStream返回DataStream。

接收一个元素,产出0个,1个,或者更多的元素。下面是一个字符串拆分为多个字符串的FlatMap

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataStream.flatMap(new FlatMapFunction<String, String>() {
    @Override
    public void flatMap(String value, Collector<String> out)
        throws Exception {
        for(String word: value.split(" ")){
            out.collect(word);
        }
    }
});

Filter

输入DataStream返回DataStream。

过滤数据,function返回为true的会被保留,为false的会被排除。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataStream.filter(new FilterFunction<Integer>() {
    @Override
    public boolean filter(Integer value) throws Exception {
        return value != 0;
    }
});

KeyBy

输入DataStream返回KeyedStream。

按照key将数据拆分为不同的集合,具有相同key的数据放到同一个集合,内部使用hashCode来判断是否属于同一个key。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataStream.keyBy(value -> value.getSomeKey());
dataStream.keyBy(value -> value.f0);

Reduce

输入 KeyedStream 返回 DataStream。

将按照key拆分的集合滚动处理。合并当前元素和最后一次合并的结果,然后返回一个新的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
keyedStream.reduce(new ReduceFunction<Integer>() {
    @Override
    public Integer reduce(Integer value1, Integer value2)
    throws Exception {
        return value1 + value2;
    }
});

Window

输入 KeyedStream 返回 WindowedStream。

窗口可以定义在KeyedStreams上,窗口可以将每个key的数据按照某种特征分组,点击链接 windows 查看完整的针对窗口的描述

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataStrea。m
  .keyBy(value -> value.f0)
  .window(TumblingEventTimeWindows.of(Time.seconds(5))); 

WindowAll

输入 DataStream 返回 AllWindowedStream。

窗口可以定义在常规的DataStream上。窗口可以将数据按照某种特征分组,点击链接 windows 查看完整的针对窗口的描述

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataStream
  .windowAll(TumblingEventTimeWindows.of(Time.seconds(5)));
Window Apply

输入 WindowedStream或者AllWindowedStream 输出 DataStream 。

应用一个函数reduce到窗口。点击链接 windows 查看完整的针对窗口的描述

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
windowedStream.apply(new WindowFunction<Tuple2<String,Integer>, Integer, Tuple, Window>() {
    public void apply (Tuple tuple,
            Window window,
            Iterable<Tuple2<String, Integer>> values,
            Collector<Integer> out) throws Exception {
        int sum = 0;
        for (value t: values) {
            sum += t.f1;
        }
        out.collect (new Integer(sum));
    }
});

WindowFunction 类型参数: – 输入值的类型。 – 输出值的类型。 – 密钥的类型。 – 可以应用此窗口函数的Window类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// applying an AllWindowFunction on non-keyed window stream
allWindowedStream.apply (new AllWindowFunction<Tuple2<String,Integer>, Integer, Window>() {
    public void apply (Window window,
            Iterable<Tuple2<String, Integer>> values,
            Collector<Integer> out) throws Exception {
        int sum = 0;
        for (value t: values) {
            sum += t.f1;
        }
        out.collect (new Integer(sum));
    }
});

AllWindowFunction类型参数: – 输入值的类型。 – 输出值的类型。 – 可以应用此窗口函数的Window类型。

WindowReduce

输入 WindowedStream 输出 DataStream 。

应用一个Reduct函数到窗口,并返回合并后的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
windowedStream.reduce (new ReduceFunction<Tuple2<String,Integer>>() {
    public Tuple2<String, Integer> reduce(Tuple2<String, Integer> value1, Tuple2<String, Integer> value2) throws Exception {
        return new Tuple2<String,Integer>(value1.f0, value1.f1 + value2.f1);
    }
});
Union

合并两个或更多的流,返回新的流包含所有流中的元素。包含重复的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataStream.union(otherStream1, otherStream2, ...);
Window Join

基于指定的key和共同窗口join两个数据流,返回一个新的数据流。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataStream.join(otherStream)
    .where(<key selector>).equalTo(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.seconds(3)))
    .apply (new JoinFunction () {...});
Interval Join

输入 KeyedStream,返回一个数据流。

基于在指定时间间隔内的共同key,Join 两个KeyedStream的流。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// this will join the two streams so that
// key1 == key2 && leftTs - 2 < rightTs < leftTs + 2
keyedStream.intervalJoin(otherKeyedStream)
    .between(Time.milliseconds(-2), Time.milliseconds(2)) // lower and upper bound
    .upperBoundExclusive(true) // optional
    .lowerBoundExclusive(true) // optional
    .process(new IntervalJoinFunction() {...});
Window CoGroup

输入两个数据流,返回一个数据流。

将两个流按照指定key和公共窗口合并,某些键可能只包含在两个原始数据集之一中。 在这种情况下,对于不包含具有该特定键的元素的数据集一侧,将使用空输入调用 CoGroup 函数。 CoGroupFunction类型参数:

– 第一个输入数据集的数据类型。 – 第二个输入数据集的数据类型。 – 返回元素的数据类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataStream.coGroup(otherStream)
    .where(0).equalTo(1)
    .window(TumblingEventTimeWindows.of(Time.seconds(3)))
    .apply (new CoGroupFunction () {...});
Connect

输入 DataStream,DataStream ,返回ConnectedStream。

连接两个数据流保持原有类型。连接允许两个流之间共享状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DataStream<Integer> someStream = //...
DataStream<String> otherStream = //...

ConnectedStreams<Integer, String> connectedStreams = someStream.connect(otherStream);
CoMap,CoFlatMap

输入 ConnectedStream 输出 DataStream 。

类似于已关联数据流上的map和flatMap。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
connectedStreams.map(new CoMapFunction<Integer, String, Boolean>() {
    @Override
    public Boolean map1(Integer value) {
        return true;
    }

    @Override
    public Boolean map2(String value) {
        return false;
    }
});
connectedStreams.flatMap(new CoFlatMapFunction<Integer, String, String>() {

   @Override
   public void flatMap1(Integer value, Collector<String> out) {
       out.collect(value.toString());
   }

   @Override
   public void flatMap2(String value, Collector<String> out) {
       for (String word: value.split(" ")) {
         out.collect(word);
       }
   }
});
Iterate

通过将一个操作符的输出重定向到之前的某个操作符,在流中创建一个“反馈”循环。这对于定义不断更新模型的算法尤其有用。下面的代码从一个流开始,并不断地应用迭代体。大于0的元素被发送回反馈通道,其余的元素被向下转发。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IterativeStream<Long> iteration = initialStream.iterate();
DataStream<Long> iterationBody = iteration.map (/*do something*/);
DataStream<Long> feedback = iterationBody.filter(new FilterFunction<Long>(){
    @Override
    public boolean filter(Long value) throws Exception {
        return value > 0;
    }
});
iteration.closeWith(feedback);
DataStream<Long> output = iterationBody.filter(new FilterFunction<Long>(){
    @Override
    public boolean filter(Long value) throws Exception {
        return value <= 0;
    }
});
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
软考高级:数据流图概念和例题
数据流图(DFD)是一种图形化的系统分析和设计工具,它用以描述系统中数据的流动、数据的输入和输出以及数据的存储。它通过图形符号来表示系统中的数据流、处理过程、数据存储和数据源/终点,是理解系统如何处理数据的有效方式。
明明如月学长
2024/05/24
2500
软考高级:数据流图概念和例题
【愚公系列】软考高级-架构设计师 074-需求工程
需求工程(Requirements Engineering)是指软件工程中的一个重要领域,专注于确定用户需求、系统需求和软件需求,并确保这些需求被正确地捕获、分析、规范和管理。需求工程是软件开发生命周期的早期阶段,关注于确保软件系统开发过程中对需求的准确理解和有效管理。
愚公搬代码
2024/07/28
1720
软件工程:需求开发阶段
需求开发阶段的主要任务就是分析问题,研究问题所发生的现实世界(即问题域),寻找实现软件系统与现实世界有效互动的办法,并严格描述该互动办法。而软件需求开发是一个连接现实世界与计算机世界的活动,是软件工程的起始阶段,设计、实现等后续阶段的正确性都以它的正确性为前提。如果需求开发过程中有错误未能解决,则其后的所有阶段都会受到影响,因此与需求有关的错误修复代价较高,需求问题对软件成败的影响较大。而我们之所以认识不到需求开发阶段的重要性主要是因为学校时间项目的特殊性,具体来说学校的课程设计或实训:
Here_SDUT
2022/09/19
2.2K0
软件工程:需求开发阶段
「数据架构」5分钟学会数据流程图:客户服务系统示例
数据流图(DFD)提供了系统内信息流(即数据流)的可视化表示。通过创建一个数据流图,您可以告诉参与系统流程的人员所提供和交付的信息、完成流程所需的信息以及需要存储和访问的信息。数据流图在软件工程中得到了广泛的应用。您可以在信息系统建模中使用DFD。本文以客户服务系统为例,对数据流图(DFD)进行了描述和说明。
架构师研究会
2019/12/25
1.1K0
系统分析师案例必备知识点汇总---2023系列文章一
累计净现金流量开始出现正值的年份数- 1+ | 上年累计净现金流量 | /当年净现金流量 ②动态投资回收期:
小马哥学JAVA
2023/01/17
1.2K0
系统分析师案例必备知识点汇总---2023系列文章一
累计净现金流量开始出现正值的年份数- 1+ | 上年累计净现金流量 | /当年净现金流量 ②动态投资回收期:
小马哥学JAVA
2023/02/27
5490
系统分析师案例必备知识点汇总---2023系列文章一
数据流图DFD画法「建议收藏」
数据流图(DFD- Data Flow Diagram)让系统分析者弄清楚“做什么”的问题,其重要性就不言而喻了。那么我们怎么画数据流图呢?数据流图与系统流程图又有什么区别呢?
全栈程序员站长
2022/06/25
2.7K0
数据流图DFD画法「建议收藏」
【理论】软件工程中的数据流图
数据流图和数据字典是结构化分析方法中常用的两种工具。本文中基础资料收集于网络,顶层数据流图部分加入里自己的理解。
needrunning
2019/07/04
1.9K0
【理论】软件工程中的数据流图
软件工程—数据流图的概念及步骤
数据流图(Data Flow Diagram,DFD)是从数据传递和加工的角度,以图形的方式来描述逻辑输入经过系统加工处理后转化为逻辑输出的结构化系统分析工具
Hopestarit
2021/11/25
17.5K0
软件工程—数据流图的概念及步骤
数据流程图 (DFD) 示例:食品订购系统
数据流图也称为气泡图。它通常用作创建系统概述的初步步骤,而不需要详细介绍,以后可以将其作为自上而下的分解方式进行详细说明。DFD显示将从系统输入和输出的信息类型,数据如何流经系统以及数据将存储在何处。与传统的结构化流程图不同,它不显示有关流程时序的信息,也不显示流程是按顺序还是并行运行的。
Warren2Lynch
2018/07/13
5.2K0
数据流程图 (DFD) 示例:食品订购系统
我的软考之路(八)——三大原则学会数据流图
数据流图是软考当中比较重要的一部分考点,不仅上午的选择题会考,而且下午要考一个大题。所以对数据流图的学习不容忽视。
程序猿小亮
2021/01/28
1.9K0
软件工程:数据流图和结构图怎么画?
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,(ノ´▽`)ノ♪-》点击这里->一个宝藏级人工智能教程网站。
全栈程序员站长
2022/07/02
4.4K0
软件工程:数据流图和结构图怎么画?
软考中级(软件设计师)——数据流图(DFD图下午第一题15分)(必拿题)
数据流(带箭头的线)、加工(圆圈/倒角的矩形)、数据存储(平行线/开右口的长方形)、外部实体(长方形)。
红目香薰
2022/11/30
2.6K0
软考中级(软件设计师)——数据流图(DFD图下午第一题15分)(必拿题)
软考下午题第1题——数据流,题目分析与案例解析:
下午第一题肯定是数据流的题目,那么,数据流肯定要找到对应的实体、关系模式等内容,审题的时候一定要细致,下午时间也是相当够的,所以每句话记住,至少读3遍,肯定能找到关系和实体,缺少的步骤多读几次也能找个差不多。
红目香薰
2022/11/29
1.2K0
软考下午题第1题——数据流,题目分析与案例解析:
软考高级架构师:数据库案例篇 - ER 图和数据流图
从数据流图(DFD)转换为实体关系图(ER图)是一个重要的步骤,可以帮助将系统的动态流程转换为静态的数据模型。以下是一些经验和步骤,帮助你完成这一过程:
明明如月学长
2024/05/25
8160
软考高级架构师:数据库案例篇 - ER 图和数据流图
软件工程期末考试题库(超全)[通俗易懂]
A. 过程        B. 软件系统   C. 硬件环境         D. 人员
全栈程序员站长
2022/08/22
3.1K0
软件工程期末考试题库(超全)[通俗易懂]
软件工程期末考试复习(二) 可行性研究的任务系统流程图数据流图数组字典
3、可行性研究需要的时间长短取决于工程的规模,一般说来,可行性研究的成本只是预期的工程总成本的5%·10%
用户2417870
2019/09/18
2.9K0
软件工程期末考试复习(二)

        可行性研究的任务系统流程图数据流图数组字典
软考小记-软件工程
模块的控制范围包括模块本身及其所有的从属模块。模块的作用范围是指模块一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围.,原则上一个模块的作用范围应该在其控制范围之内,若没有,则可以将判定所在模块合并到父模块中,使判定处于较高层次。 在软件设计中,人们总结了一些启发式原则,根据这些原则进行设计,可以设计出较高质量的软件系统。其中,模块的扇入扇出适中,模块大小适中以及完善模块功能都可以改进设计质量。而将相似功能的模块合并可能会降低模块内聚和提高模块之间的耦合,因此并不能改进设计质量。
WuShF
2023/11/20
3680
软考小记-软件工程
DBA 我想上一层楼,DFD 了解一下
活着绕不过修行,越简单越复杂,然后有可能是越复杂,越简单。DBA 做久了,貌似两个路径,运维DBA, 开发DBA,实际上还有另一条路,就是将其合二为一,让你自身升华一次,成为一个数据库架构师。那在软件项目中,除了去给硬件层次,或数据库层次做一个架构的规划以外, 从软件的开发角度,作为DB的层次也可以梳理和参与甚至是贴合软件来做一些事。
AustinDatabases
2020/03/10
7800
DBA 我想上一层楼,DFD 了解一下
软件需求-架构师之路(五)
重点:软件需求分为 业务需求、用户需求和系统需求,三大类。(重点:业务需求、用户需求和系统需求)
用户9919783
2023/09/06
2920
软件需求-架构师之路(五)
推荐阅读
相关推荐
软考高级:数据流图概念和例题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文