KeyedStream#max的实际用途是什么

时间:2019-09-14 03:40:34

标签: apache-flink

我有一个简单的Flink应用程序来说明KeyedStream#max

的用法
import com.huawei.flink.time.Box
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.scala.{StreamExecutionEnvironment, _}

object KeyStreamMaxTest {

  val env = StreamExecutionEnvironment.getExecutionEnvironment

  def main(args: Array[String]): Unit = {
    env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime)
    env.setParallelism(1)
    env.setMaxParallelism(1)
    val ds = env.fromElements(("X,Red,10"), ("Y,Blue,10"), ("Z,Black, 22"), ("U,Green,22"), ("N,Blue,25"), ("M,Green,23"))
    val ds2 = ds.map { line =>
      val Array(name, color, size) = line.split(",")
      Box(name.trim, color.trim, size.trim.toInt)
    }.keyBy(_.color).max("size")

    ds2.print()

    env.execute()

  }

}

输出为:

Box(X,Red,10)
Box(Y,Blue,10)
Box(Z,Black,22)
Box(U,Green,22)
Box(Y,Blue,25)  -- I thought this should be ("N,Blue,25")
Box(U,Green,23)

Looks Flink仅替换大小,但保持名称和颜色不变,

我会问这种行为的实际用途是什么?我只能想象得到具有最大大小的整个记录​​是很自然的。

1 个答案:

答案 0 :(得分:0)

有时候,您只需要知道一个字段的每个键的最大值即可。我相信max能够在完成较少工作的同时提供这些信息,而比更普遍使用的maxBy能够返回具有最大大小的整个记录​​。