2.4.2 keyBy操作
keyBy
操作就是按键分组,根据分组后的键,相同的键会被分配到同一个任务重,这样程序能够分成多个任务并行进行窗口计算,而非键控状态的流数据就无法发挥这种优势。例如2.1 一个例子中展示的那样,通过二元组的第一个元素作为key进行分组,然后进行后续的处理。当然也可以使用case class或POJO类型的数据。
使用case class
使用case class的时候可以指定字段进行分组聚合
package com.littlely.keybyops
import org.apache.flink.api.scala._
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.windowing.time.Time
case class Person(name:String, salary: Float)
object KeyByOps {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1) // 设置操作的并行度
val text = env.socketTextStream("localhost", 9999)
text.map(elem => elem.split(",")).filter(_.nonEmpty)
.map(x => Person(x(0), x(1).toFloat))
.keyBy("name")
.timeWindow(Time.seconds(5))
.sum("salary")
.print()
env.execute()
}
}