Apache Flink:我可以获取 WindowFunction 中关键字段的名称吗?

Apache Flink: Can I get the name of the key field in a WindowFunction?

我有一个 DataStream 有不同的字段,我想通过 keyBy 对其进行聚合计算(计数,平均,..)

stream.keyBy("field1").window().aggregate(AggFunc, WindowFunc)...

stream.keyBy("field2").window().aggregate(AggFunc, WindowFunc)...

stream.keyBy("field3").window().aggregate(AggFunc, WindowFunc)...

有没有办法在以后的 WindowFunc 中获取键控字段的名称("field1"、"field2"、"field3")? 请注意,我想要字段名称 "field1" 而不是字段可能的值(我已经在 WindowFunction 的应用函数中输入了这个值)。

原因:我想对3个聚合使用相同的WindowFunc - 这里我添加了window_start_time、key_field_name, key_value 到结果。

想要的结果示例:

-在字段 1 上键入的流

("field1", "field1-val1", 3, window1)
("field1", "field1-val2", 5, window1)

-在字段 2 上键入的流

("field2", "field2-val1", 6, window1)
("field2", "field2-val2", 7, window1)

不,WindowFunction 不允许访问关键字段的名称。 但是,您可以向 WindowFunction 的构造函数添加一个参数,并在其中传递字段名称。

这看起来类似于以下示例

// define window function

public static class MyWindowFunc implements WindowFunction<...> { 
    private final String keyname;

    public MyWindowFunc(String keyname) {
        this.keyname = keyname;
    }    

  ...
}

// use window function

stream.keyBy("field1").window().aggregate(AggFunc, new MyWindowFunc("field1"))...
stream.keyBy("field2").window().aggregate(AggFunc, new MyWindowFunc("field2"))...
stream.keyBy("field3").window().aggregate(AggFunc, new MyWindowFunc("field3"))...