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