如何在Scala的Flink中定义KeySelector?

时间:2018-10-24 04:47:45

标签: scala apache-flink

我的流处理过程基本上是这样的

Stream(Int, Boolean, Int).Keyby(0, 1).Window().process()

关键点是我想定义一个组合键,然后对其进行处理。但是,如果我使用keyby(0, 1)process(... Key: (Int, Boolean), ...),则过程中的密钥类型总是提示错误。我试图定义keyby(_._1, _._2),但不正确。

那么,无论如何要使用scala定义组合键,以便我可以在以下流程函数中推断诸如(Int, Boolean)之类的键类型?

谢谢!

1 个答案:

答案 0 :(得分:1)

问题在于KeyedStream[(Int, Boolean, Int), Tuple]创建了一个Tuple,其中process是Flink的元组类。这也将是Tuple函数的关键参数的类型。为了访问tuple.[T]getField(idx)的字段,您需要使用T作为字段的类型来调用ProcessWindowFunction

如果要将Scala元组作为KeySelector的键,则需要定义input .keyBy(a => (a._1, a._2)) .timeWindow(Time.days(1)) .process(new ProcessWindowFunction[(Int, Boolean, Int), Int, (Int, Boolean), TimeWindow] { override def process(key: (Int, Boolean), context: Context, elements: Iterable[(Int, Boolean, Int)], out: Collector[Int]): Unit = { out.collect(key._1) } }) 。以下代码片段可以达到目的:

Math.Floor()