flink的算子之transform算子

一.flink算子的执行过程

env -> source -> transform -> sink

3.transform算子

转换算子,把当前的DataStream转化为另一个DataStream

1)简单转换算子(DataStream)

不涉及到分组,不涉及拆分与合并,可以以one-to-one传递数据的流

前提:在虚拟机开启8888端口,在端口发送数据,在控制台进行接收原数据

nc -lk 8888

 注意:转换算子需要用到隐式转换

import org.apache.flink.streaming.api.scala._

/**
 * 创建一个温度传感器的类,把三个字段以参数的形式进行传递
 * @param id id
 * @param timestamp 时间戳
 * @param temperature 温度值
 */
case class SensorReading(id:String,timestamp:Long,temperature:Double)

/**
   * 简单转换流
   * @param env 运行环境
   * @param dataStreamOriginal 原始数据流
   */
  def transform_simple(env:StreamExecutionEnvironment,dataStreamOriginal:DataStream[String]) = {
    //转换算子需要用到隐式转换
    //import org.apache.flink.streaming.api.scala._
   //把得到的数据进行切割,以类的参数的形式传出数据
    val dataStream_sensorReading:DataStream[SensorReading] = dataStreamOriginal.map(line=>{
      val fields = line.split(",")
      SensorReading(fields(0),fields(1).toLong,fields(2).toDouble)
    })
    //把得到的数据源输出
    dataStream_sensorReading.print()
    //把结果进行返回,传给其他参数
    dataStream_sensorReading
  }

  def main(args: Array[String]): Unit = {
    //创建实时流处理的环境
    val env:StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    //设置全局并行度为1
    env.setParallelism(1)
    //创建原始数据流
    val dataStream_Original:DataStream[String]= env.socketTextStream("node160",8888)

    transform_simple(env,dataStream_Original)
    //实时数据流必须设置开启启动执行的语句
    env.execute("transform")
  }

b.键控算子(keyedStream)

按照key相同的进行分组 

滚动聚合算子,一定放在键控算子之后使用

聚合算子的特性

min:同一个key下,取当前字段的最小值,但是其他字段取同组内的第一条数据的值

minBy:聚合算子,minBy特点:同一个key下,取当前字段的最小值,其他字段取最小值的那条数据的内容

reduce:自定义取值方式

               两种形式:以匿名函数的形式和以ReduceFunction类形式

前提:在虚拟机开启8888端口,在端口发送数据,在控制台进行接收原数据

nc -lk 8888

/**
 * 以继承类的形式
 * 自定义reduce的类
 */
class MyReduce extends RichReduceFunction[SensorReading]{
  override def reduce(t: SensorReading, t1: SensorReading): SensorReading = {
    SensorReading(t.id,t1.timestamp,t.temperature.min(t1.temperature))
  }
}
/**
   * 键控转换算子
   * @param env 运行环境
   * @param dataStreamOriginal 原数据
   */
  def transform_keyBy(env:StreamExecutionEnvironment,dataStreamOriginal: DataStream[String]): Unit ={
    //把字符串类型的数据转成SensorReading类型的数据
    //简单转换流已经进行转化,直接获取即可
    val dataStream_sensorReading:DataStream[SensorReading] = transform_simple(env,dataStreamOriginal)
    //把数据按照id为key进行分组  可以直接写字段名,也可以写索引值
    val dataStream_keyById:KeyedStream[SensorReading,Tuple] = dataStream_sensorReading.keyBy(0)

    //聚合算子,min特点:同一个key下,取当前字段的最小值,但是其他字段取同组内的第一条数据的值
    val dataStream_min:DataStream[SensorReading] = dataStream_keyById.min("temperature")
    //
    val dataStr
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值