代码GitHub:https://github.com/SmallScorpion/flink-tutorial.git
map
val streamMap = stream.map {
x => x * 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(" ")
}
Filter
val streamFilter = stream.filter{
x => x == 1
}
KeyBy
DataStream → KeyedStream:逻辑地将一个流拆分成不相交的分区,每个分区包含具有相同key的元素,在内部以hash的形式实现的。
这些算子可以针对KeyedStream的每一个支流做聚合:
- sum()
- min()
- max()
- minBy()
- maxBy()
// 取以ID为组最低的温度
val keyByDStream: DataStream[SensorReading] = dataDstream.keyBy("id").minBy("temperature")
Reduce
KeyedStream → DataStream:一个分组数据流的聚合操作,合并当前的元素和上次聚合的结果,产生一个新的值,返回的流中包含每一次聚合的结果,而不是只返回最后一次聚合的最终结果。
// 3. 复杂聚合操作,reduce,得到当前id最小的温度值,以及最新的时间戳+1
val reduceStream: DataStream[SensorReading] = dataDstream
.keyBy("id")
.reduce( (curState, newData) =>
// curState是之前数据 newData是现在数据
SensorReading( curState.id, newData.timestamp + 1, curState