Scala Flink:RichMapFunction中的Access键应用于KeyedStream,以处理由选项设置密钥的流

Scala Flink:RichMapFunction中的Access键应用于KeyedStream,以处理由选项设置密钥的流,scala,apache-flink,flink-streaming,Scala,Apache Flink,Flink Streaming,当我将RichMapFunction应用于键控流时,我希望将None作为键控情况处理 例如,我有这样一个case类: case class Foo(a: Option[String], b: Int, acc: Option[Int] = None) acc是我想用我的map计算的字段 我想在流上应用一个有状态映射,因此我有一个richmappfunction(例如,它是一个累加器): 然后,我的管道将通过以下方式执行: object ExampleAccumulator extends Ap

当我将
RichMapFunction
应用于键控流时,我希望将
None
作为键控情况处理

例如,我有这样一个case类:

case class Foo(a: Option[String], b: Int, acc: Option[Int] = None)
acc
是我想用我的
map
计算的字段

我想在流上应用一个有状态映射,因此我有一个
richmappfunction
(例如,它是一个累加器):

然后,我的管道将通过以下方式执行:

object ExampleAccumulator extends App {

  val env = StreamExecutionEnvironment.getExecutionEnvironment

  env.fromElements(Foo(Some("a"), 1, None), Foo(Some("a"), 2, None), Foo(None, 10, None), Foo(None, 6, None))
    .keyBy(_.a)
    .map(new Accumulator())
    .print()

  env.execute("ExampleAccumulator")
}
输出为:

Foo(Some(a),1,Some(1))
Foo(Some(a),2,Some(3))
Foo(None,10,Some(10))
Foo(None,6,Some(16))
但是,当键为
None
时,我想在
acc
中获得
None


是否可以在RichMapFunction中获取密钥?

目前不支持该功能。
可以通过KeyContext类中的getCurrentKey()方法获取密钥,该方法未在RichMapFunction中公开。但是,Flink在内部提供了KeyedProcessFunction,可以在参数上下文中返回key。我相信这就是您想要的。

您可以通过
Foo
的值,通过
KeySelector
API,Scala解决方案,访问密钥:

val selector = scalaKeyedStream
  .javaStream 
  .asInstanceOf[org.apache.flink.streaming.api.datastream.KeyedStream]
  .getKeySelector

scalaKeyedStream.map(in => selector.getKey(in))

您需要将Scala流转换为Java,因为Scala API中没有
getKeySelector
方法。

非常感谢,对我来说似乎是正确的事情,即使我也想保留
映射的一个输入/一个输出的概念。现在还可以:)@Thomas,对不起,我不知道为什么我不能使用markdown将源代码附加到这里。您可以在org.apache.flink.streaming.api.datastream.KeyedStream中检查流程函数。
val selector = scalaKeyedStream
  .javaStream 
  .asInstanceOf[org.apache.flink.streaming.api.datastream.KeyedStream]
  .getKeySelector

scalaKeyedStream.map(in => selector.getKey(in))