一、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. 打破格式壁垒 !COS助力腾讯文档优化在线预览效果

    说起腾讯文档,相信大家对此并不陌生.在新冠疫情防控期间,腾讯文档在人员流动排查.健康信息收集.居家学习.协同办公等场景发挥了巨大的作用. 腾讯文档不仅支持新建word.excel.ppt.思维导图.流 ...

  2. 加速人民币国际化,CIPS迎来三大变化

    何谓CIPS? 人民币跨境支付系统(Cross-border Interbank Payment System,简称CIPS)是由中国人民银行组织开发的独立支付系统,为境内外金融机构人民币跨境和离岸业 ...

  3. JVM 语言的探索发现

    又在 WIKI 上溜达了一下 https://en.wikipedia.org/wiki/List_of_JVM_languages,有一些新的发现: ColdFusion Markup Langua ...

  4. 永久告别mac屏幕涂层脱落

    转载:https://www.feng.com/post/11380203 我从2011年开始使用Mac book pro电脑,到现在的2016款已经是第三台了,我从来都不会被涂层脱落这个问题困扰,我 ...

  5. Qt编写地图综合应用39-覆盖物圆形

    一.前言 圆形的应用场景和多边形.矩形基本一致,支持的属性也是一致,比如可以设置线条的颜色.线条的粗细.线条透明度等.也是用来框起一块区域,然后根据坐标点集合,找到该区域内的标注点集合,比如指定某个县 ...

  6. kubernetes系列(八) - 控制器的资源清单定义

    1. ReplicaSet 1.1 ReplicaSet资源清单 1.2 selector 2. Deployment 2.1 Deployment资源清单 2.2 其他相关操作 2.2.1 应用ya ...

  7. [LC1260]二维网格迁移

    二维网格迁移 题目描述 给你一个 m 行 n 列的二维网格 grid 和一个整数 k.你需要将 grid 迁移 k 次. 每次「迁移」操作将会引发下述活动: 位于 grid[i][j] 的元素将会移动 ...

  8. 前端学习openLayers配合vue3(圆形形状的绘制)

    上节课我们学了加载了矢量图片,这节我们来学绘制圆形 关键代码,第一段呢是设置圆点的操作,第二步是点击地图获取地图位置来设置圆点,ol还有很多类,各种形状的 //设置圆点 // let anchorLa ...

  9. Appium_测试步骤读取自外部文件:定制执行引擎

    testcase.yaml: - id: home_search - id: search_input_text input: alibaba - id: name - id: current_pri ...

  10. Solution -「AGC 031E」Snuke the Phantom Thief

    \(\mathscr{Description}\)   Link.   在一个网格图内有 \(n\) 个格子有正价值,给出四种限制:横 / 纵坐标不大于 / 不小于 \(a\) 的格子不能选超过 \( ...