一.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