Flink常用算子说明


1 FLINK算子说明

1.1 TRANSFORM

1.1.1 map

在这里插入图片描述

val streamMap = stream.map { x => x * 2 }

1.1.2 flatMap

flatMap的函数签名:def flatMap[A,B](as: List[A])(f: A ⇒ List[B]): List[B]
例如: flatMap(List(1,2,3))(i ⇒ List(i,i))
结果是List(1,1,2,2,3,3),
而List(“a b”, “c d”).flatMap(line ⇒ line.split(" "))
结果是List(a, b, c, d)。

val streamFlatMap = stream.flatMap{
    x => x.split(" ")
} 

1.1.3 Filter

在这里插入图片描述

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

1.1.4 KeyBy

在这里插入图片描述

DataStream → KeyedStream:逻辑地将一个流拆分成不相交的分区,每个分区包含具有相同key的元素,在内部以hash的形式实现的。

val streamKeyby = stream.keyBy(0)

1.1.5 滚动聚合算子(Rolling Aggregation)

这些算子可以针对KeyedStream的每一个支流做聚合。

  • List item
  • sum()
  • min()
  • max()
  • minBy()
  • maxBy()

1.1.6 Reduce

KeyedStream → DataStream:一个分组数据流的聚合操作,合并当前的元素和上次聚合的结果,产生一个新的值,返回的流中包含每一次聚合的结果,而不是只返回最后一次聚合的最终结果。

val env: StreamExecutionEnvironment =
StreamExecutionEnvironment.getExecutionEnvironment

val dataDS: DataStream[String] = env.readTextFile("input/data.txt")
val ds: DataStream[WaterSensor] = dataDS.map(
    s => {
        val datas = s.split(",")
        WaterSensor(datas(0), datas(1).toLong, datas(2).toDouble)
    }
).keyBy(0).reduce(
    (s1, s2) => {
        println(s"${s1.vc} <==> ${s2.vc}")
        WaterSensor(s1.id, s1.ts, math.max(s1.vc, s2.vc))
    }
)

ds.print()

env.execute("sensor")

1.1.7 Split 和 Select

Split算子
在这里插入图片描述

DataStream → SplitStream:根据某些特征把一个DataStream拆分成两个或者多个DataStream。
需求:将水位传感器数据按照空高高低(以40cm,30cm为界),拆分成三个流。

val splitDS: SplitStream[WaterSensor] = dataDS.map(
    s => {
        val datas = s.split(",")
        WaterSensor(datas(0), datas(1).toLong, datas(2).toDouble)
    }
).split(
    sensor => {
        if (sensor.vc >= 40) {
            Seq("alarm")
        } else if (sensor.vc >= 30) {
            Seq("warn")
        } else {
            Seq("normal")
        }
    }
)

Select算子
在这里插入图片描述

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

val alarmDS: DataStream[WaterSensor] = splitDS.select("alarm")
val warnDS: DataStream[WaterSensor] = splitDS.select("warn")
val normalDS: DataStream[WaterSensor] = splitDS.select("normal")

alarmDS.print("alarm")
warnDS.print("warn")
normalDS.print("normal")

1.1.8 Connect和 CoMap

在这里插入图片描述

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

val alarmDS: DataStream[WaterSensor] = splitDS.select("alarm")
val warnDS: DataStream[WaterSensor] = splitDS.select("warn")

val connectDS: ConnectedStreams[WaterSensor, WaterSensor] =
alarmDS.connect(warnDS)

CoMap,CoFlatMap
在这里插入图片描述
ConnectedStreams → DataStream:作用于ConnectedStreams上,功能与map和flatMap一样,对ConnectedStreams中的每一个Stream分别进行map和flatMap处理。

val coMapDS: DataStream[(Long, String)] = connectDS.map(
    waterSensor1 => {
        (waterSensor1.ts, "alarm")
    },
    waterSensor2 => {
        (waterSensor2.ts, "warn")
    }
)
coMapDS.print() 

1.1.9 Union

在这里插入图片描述

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

val alarmDS: DataStream[WaterSensor] = splitDS.select("alarm")
val warnDS: DataStream[WaterSensor] = splitDS.select("warn")
val normalDS: DataStream[WaterSensor] = splitDS.select("normal")

val unionDS: DataStream[WaterSensor] =
alarmDS.union(warnDS,normalDS)

unionDS.print()

Connect与 Union 区别:

  1. Union之前两个流的类型必须是一样,Connect可以不一样,在之后的coMap中再去调整成为一样的。
  2. Connect只能操作两个流,Union可以操作多个。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值