Flink之Transform

127 阅读2分钟

1. map

结构转换 image.png

//类似于spark中的map算子,一对一
val streamMap = stream.map { x => x * 2 }

2. flatMap

image.png

val stream = env.fromElements("spark flink", "flink scala hadoop")
stream.flatMap(e => {
        e.split(" ")
      })

3. filter

数据剔除,过滤

//偶数留下,过滤掉奇数
val stream = env.fromElements(1, 2, 3)
    stream.filter(_%2 == 0).print()

4. keyBy

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

5. 滚动聚合算子(Rolling Aggregation)

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

  1. sum()
  2. min()
  3. max()
  4. minBy()
  5. maxBy()
val stream = env.fromElements("spark flink", "flink scala hadoop", 
"spark flink", "scala flink")
    stream
      .flatMap(e => {
        e.split(" ")
      })
      .map((_, 1))
      .keyBy(0)
      .sum(1)
      .print()

6. reduce

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

val stream = env.fromElements("spark flink", "flink scala hadoop",
"spark flink", "scala flink")
    stream
      .flatMap(e => {
        e.split(" ")
      })
      .map((_, 1))
      .keyBy(0)
      .reduce((r1, r2) => (r1._1, r1._2 + r2._2))
      .print()

7. connect和Comap

  1. connect image.png

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

  1. CoMap,CoFlatMap

image.png

ConnectedStreams → DataStream:作用于ConnectedStreams上,功能与map和flatMap一样,对ConnectedStreams中的每一个Stream分别进行map和flatMap处理。

8. union

image.png

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

9. Connect与 Union 区别

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