在Flink中,如何在Keyed Stream上应用过程功能时访问密钥?

时间:2017-11-24 22:10:16

标签: apache-flink flink-streaming

在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。但如果我能避免这样做,那将是理想的。

2 个答案:

答案 0 :(得分:0)

如果您在显示键控流并应用ProcessWindowFunction<IN, OUT, KEY, W extends Window>时,似乎可以获取密钥。

Apache flink docs上有一些this的例子。请注意,ProcessWindowFunction效率低,应与ReduceFunctionAggregateFunctionFoldFunction结合使用。

希望这有帮助!

答案 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
}

}