一、Split 和 Select (使用split切分过的流是不能被二次切分的)

DataStream --> SplitStream : 根据特征把一个DataSteam 拆分成两个或者多个DataStream.

SplitStream --> DataStream:从一个SplitStream中获取一个或者多个DataStream。

二、Connect 和 CoMap / CoFlatMap

DataStream,DataStream --> ConnectedStream:连接两个保持他们类型的数据流,两个数据流被Connect之后,只是被放在了一个同一个流中,内部依然保持着各自的数据和形式,不发生变化,两个流相互独立。

ConnectedStream --> DataStream:作用与 ConnectedStream上,功能与map和Flatmap一样,对 ConnectedStream中的每一个Stream分别进行map和flatmap处理。

三、Union

 DataStream --> DataStream:对两个或者两个以上的DataStream进行union操作,产生一个包含所有DataStream元素的新DataStream

注意:Connect 与 Union区别:

1、Union之前两个流的类型必须是一样的,Conect可以不一样,并且Connect之后进行coMap中调整为一样的。

2、Connect只能操作两个流,Union可以操作多个。

综合代码:(可直接运行,数据在注释中)

package com.wyh.streamingApi.Transform

import org.apache.flink.api.common.functions.ReduceFunction
import org.apache.flink.streaming.api.scala._ //温度传感器读数样例类
case class SensorReading(id: String, timestamp: Long, temperature: Double) object TransformTest {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1) /**
* sensor_1,1547718199,35.80018327300259
* sensor_6,1547718201,15.402984393403084
* sensor_7,1547718202,6.720945201171228
* sensor_10,1547718205,38.1010676048934444
* sensor_1,1547718199,35.1
* sensor_1,1547718199,31.0
* sensor_1,1547718199,39
*/
val streamFromFile = env.readTextFile("F:\\flink-study\\wyhFlinkSD\\data\\sensor.txt") //基本转换算子和滚动聚合算子=======================================================================================
/**
* map keyBy sum
*/
val dataStream: DataStream[SensorReading] = streamFromFile.map(data => {
val dataArray = data.split(",")
SensorReading(dataArray(0).trim, dataArray(1).trim.toLong, dataArray(2).trim.toDouble)
}) // dataStream.keyBy(0).sum(2).printToErr("keyBy test") //scala强类型语言 只有_.id 可以指定返回类型
val aggStream: KeyedStream[SensorReading, String] = dataStream.keyBy(_.id)
val stream1: DataStream[SensorReading] = aggStream.sum("temperature")
// stream1.printToErr("scala强类型语言") /**
* reduce
*
* 输出当前传感器最新的温度要加10,时间戳是上一次数据的时间加1
*/
aggStream.reduce(new ReduceFunction[SensorReading] {
override def reduce(t: SensorReading, t1: SensorReading): SensorReading = {
SensorReading(t.id, t.timestamp + 1, t1.temperature + 10)
}
}) //.printToErr("reduce test") //多流转换算子====================================================================================================
/**
* 分流
* split select
* DataStream --> SplitStream --> DataStream
*
* 需求:传感器数据按照温度高低(以30度为界),拆分成两个流
*/
val splitStream = dataStream.split(data => {
//盖上戳 后面进行分拣
if (data.temperature > 30) {
Seq("high")
} else if (data.temperature < 10) {
Seq("low")
} else {
Seq("health")
}
}) //根据戳进行分拣
val highStream = splitStream.select("high")
val lowStream = splitStream.select("low")
val healthStream = splitStream.select("health") //可以传多个参数,一起分拣出来
val allStream = splitStream.select("high", "low") // highStream.printToErr("high")
// lowStream.printToErr("low")
// allStream.printToErr("all")
// healthStream.printToErr("healthStream") /**
* 合并 注意: Connect 只能进行两条流进行合并,但是比较灵活,不同流的数据结构可以不一样
* Connect CoMap/CoFlatMap
*
* DataStream --> ConnectedStream --> DataStream
*/
val warningStream = highStream.map(data => (data.id, data.temperature))
val connectedStream = warningStream.connect(lowStream) val coMapDataStream = connectedStream.map(
warningData => (warningData._1, warningData._2, "温度过高报警!!"),
lowData => (lowData.id, lowData.temperature, "温度过低报警===")
) // coMapDataStream.printToErr("合并流") /**
* 合并多条流 注意: 要求数据结构必须要一致,一样
*
* Union DataStream --> DataSteam 就没有一个中间转换操作了
*
*/ val highS = highStream.map(h => (h.id, h.timestamp, h.temperature, "温度过高报警!!"))
val lowS = lowStream.map(l => (l.id, l.timestamp, l.temperature, "温度过低报警==="))
val healthS = healthStream.map(l => (l.id, l.timestamp, l.temperature, "健康")) val unionStream = highS.union(lowS).union(healthS) unionStream.printToErr("union合并") env.execute("transform test")
} }

Flink学习(七) 多流转换算子 拆分合并流的更多相关文章

  1. Flink实例(五十): Operators(十)多流转换算子(五)coGroup 与union

    参考链接:https://mp.weixin.qq.com/s/BOCFavYgvNPSXSRpBMQzBw 需求场景分析 需求场景 需求诱诱诱来了...数据产品妹妹想要统计单个短视频粒度的「点赞,播 ...

  2. Flink学习笔记:Operators串烧

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

  3. Flink学习笔记:Flink Runtime

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

  4. flink学习笔记-数据源(DataSource)

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

  5. flink学习笔记-各种Time

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

  6. flink学习总结

    flink学习总结 1.Flink是什么? Apache Flink 是一个框架和分布式处理引擎,用于处理无界和有界数据流的状态计算. 2.为什么选择Flink? 1.流数据更加真实的反映了我们的生活 ...

  7. Apache Flink学习笔记

    Apache Flink学习笔记 简介 大数据的计算引擎分为4代 第一代:Hadoop承载的MapReduce.它将计算分为两个阶段,分别为Map和Reduce.对于上层应用来说,就要想办法去拆分算法 ...

  8. php 接收二进制流转换成图片

    php 接收二进制流转换成图片,图片类imageUpload.php如下: <?php /** * 图片类 * @author http://blog.csdn.net/haiqiao_2010 ...

  9. delphi 怎么将一个文件流转换成字符串(String到流,String到文件,相互转化)

    //from   http://kingron.myetang.com/zsfunc0d.htm (*//   标题:充分利用pascal字符串类型   说明:和PChar不同,string可以保存# ...

  10. MyBatis学习七:spring和MyBatis整合

    <\mybatis\day02\16mybatis和spring整合-sqlSessionFactory配置.avi;> MyBatis学习七:spring和MyBatis整合.逆向工程 ...

随机推荐

  1. CentOS8 Failed to start docker.service: Unit docker.service not found处理方式

    出现该问题的原因是 centos8 中的podman导致的,podman是centos8预装的类似docker的软件  不需要所以直接卸载. 解决方式: dnf remove podman 然后重装D ...

  2. 深入聊聊async&Promise

    正文 最近在学习JavaScript里的async.await异步,对于其中的Promise状态以及背后的Js引擎实际运行状态不大理解且很感兴趣,因此花了一点时间仔细研究了一下. 从Example说起 ...

  3. 对比 ASP.NET Core 中的 HttpContext.Features 与 HttpContext.Items

    对比 ASP.NET Core 中的 HttpContext.Features 与 HttpContext.Items https://newbedev.com/httpcontext-feature ...

  4. 【C#】【桌面应用开发】拖拽文件到文本框获得所拖拽文件的路径

    步骤1:设置文本框属性 设置文本框属性,将属性AllowDrop改为True 使其允许拖拽文件 步骤2: 在控件事件管理中双击DragEnter,添加事件 private void Form_sett ...

  5. 如何在 Ubuntu 20.04 上安装 MySQL

    https://dev.mysql.com/downloads/mysql/ 简介: MySQL是最流行的开源关系数据库管理系统.它速度快,容易使用,容易扩展,并且流行的LAMP和LEMP的一部分. ...

  6. 解决phpmyadmin导入MYSQL数据库限制大小为50M的问题

    有时候想导入的数据库太大.但是遭到的限制 解决phpmyadmin导入MYSQL数据库限制大小为50M的问题 转载于:https://www.cnblogs.com/wesky/p/10609340. ...

  7. Qt音视频开发47-通用视频控件

    一.前言 自从视频监控系统的内核不断增加,从最初的vlc到ffmpeg然后到mpv,后面还陆续增加了海康sdk等,每次增加一个内核,整个视频监控系统就有三五个代码文件需要修改,而且大部分是重复的代码, ...

  8. [转]C# 组合查询条件

    在我们开发过程中经常会遇见一些通过条件获取数据的功能,比如说获取我们的用户信息,查询输入框有用户姓名,部门,入职年份等等,但查询时可能只输入一个条件或多个条件,像这种不确定的查询时,我们应该如何处理. ...

  9. LetsTalk_Android中引导用户加入白名单图-2

    =================================================================== ================================ ...

  10. IM消息ID技术专题(七):网易严选分布式ID的技术选型、优化、落地实践

    1.引言 在<IM消息ID技术专题>系列文章的前几篇中,我们已经深切体会到消息ID在分布式IM聊天系统中的重要性以及技术实现难度,各种消息ID生成算法及实现虽然各有优势,但受制于具体的应用 ...