在Flink中,我有一个键控流,我正在应用一个处理函数。
myDataStream
.keyBy(new MyKeySelector())
.process(new FooBarProcessFunction())
我的密钥选择器看起来像这样......
public class MyKeySelector implements KeySelector<FooBar, FooKey>
public FooKey getKey (FooBar value) {
return new FooKey (value);
}
FooBarProcessFunction看起来像这样......
public class FooBarProcessFunction extends ProcessFunction<FooBar, TransformedFooBar> {
public void processElement(FooBar newFooBar, Context ctx, Collector<FooBar> out) {
//do something with newFooBar
// *****but I also want to know the Key (FooKey) here*****
}
}
在FooBarProcessFunction中,我想获取由MyKeySelector的getKey方法创建的Key。那是可行的吗?
目前,我正在使用一种解决方法,其中我基本上在processElement函数中重新创建了Key。但如果我能避免这样做,那将是理想的。
答案 0 :(得分:0)
如果您在显示键控流并应用ProcessWindowFunction<IN, OUT, KEY, W extends Window>
时,似乎可以获取密钥。
Apache flink docs上有一些this的例子。请注意,ProcessWindowFunction
效率低,应与ReduceFunction
,AggregateFunction
或FoldFunction
结合使用。
希望这有帮助!
答案 1 :(得分:0)
为了从过程功能访问键,您应该使用KeyedProcessFunction
您的示例成为:
public class FooBarProcessFunction extends KeyedProcessFunction<FooKey, FooBar, TransformedFooBar> {
public void processElement(FooBar newFooBar, Context ctx, Collector<FooBar> out) {
//do something with newFooBar
// *****but I also want to know the Key (FooKey) here*****
ctx.getCurrentKey
}
}