flink入门(三)——DataStream API

一、概述

  1.大致流程:主要分五步

获取一个执行环境
加载/创建初始数据
指定数据上的转换
指定计算结果放在哪里
触发程序执行

 详细步骤,可以参考https://www.cnblogs.com/cjsblog/p/12967555.html

 1)在sacla中可以通过静态方法获取执行环境:(根据上下文自动推断)

val env = StreamExecutionEnvironment.getExecutionEnvironment()

 2)DataSource数据输入

    主要包含:内置数据源和第三方数据源Connector,例如Kafka Connector等

    从文件中读取数据示例:

DataStream<String> text = env.readTextFile("file:///path/to/file");

     从kafka读取示例如下:

      https://blog.csdn.net/u013076044/article/details/102651473

二、Transfrom算子

  1.map

    对数据流中的每一个元素进行转换逻辑操作,最终返回每一个输入元素转换后的结果数据继续封装成一个DataStream对象返回

    (例如每个元素拼接一个字符串或者数字*2等再输出),属于比较简单比较基础的:

val result = dataStream.map(e => "map"+e)

  2.flatMap

    对每个输入元素进行压平、压扁操作,即输入一个元素,根据你的业务逻辑决定返回几个元素,可以返回0个元素或1个元素或者n个元素

val result = dataStream.flatMap(_.split(" "))

    // 传入的可以不止是一个元素,可以是一个List进行压扁输出

   3.fillter

    元素过滤:

val streamFilter = stream.filter{x => x == 1}

  4.keyby

    分区操作,开窗的前提:

val keyedStream = dataStream.keyBy(0)
// val stockPriceStream: DataStream[StockPrice] = stockPriceRawStream.keyBy(_.symbol)

  5.聚合算子  

   可以使用字段顺序,也可以使用字段名

  sum()

  min()

  max()

  minBy()

  maxBy()

    以上必须是KeyBy之后才能聚合

val sumed: DataStream[SensorReading] = maped.keyBy(0).min(2)

   6.reduce

    一个分组数据流的聚合操作,合并当前的元素和上次聚合的结果,产生一个新的值,返回的流中包含每一次聚合的结果

  7.多流转换算子

    Split和Select

    split:将一个流拆分成多个流,再结合select选择出拆分出的流

    例如按照温度30来分割成两个流:

    

     connect和coMap,union

      connect对应的是上面分流之后的合流,当然,这里仅仅是外面包了一层,实际上还是两个流各管各的

       union则是数据类型需要对齐才能union,这点和SQL是类似的

三、flink的UDF函数

   可以通过暴露出来的接口进行细粒度编程控制,其实这也是flink的编程方式

   

     富函数Rich Function可以实现上下文的获取控制,不展开

四、DataStream的sink

  最常用的就是:

stream.addSink(new Sink)

  当然,主流的都是官方有支持的,甚至Print都是一个基础的sink:

  

   主流sink:

    

     redis的sink,essink暂不展开。

    与MySQL等的连接,在1.11版本后有更新:https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/connectors/jdbc.html

原文地址:https://www.cnblogs.com/jiangbei/p/13864135.html