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()
  }
}

results matching ""

    No results matching ""