Apache flink ApacheFlink:我可以在WindowFunction中获取键字段的名称吗?

Apache flink ApacheFlink:我可以在WindowFunction中获取键字段的名称吗?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一个数据流,它有不同的字段,我想键入这些字段来进行聚合计算(计数、平均值……) 是否有办法在以后的WindowFunc中获取键入字段的名称(“字段1”、“字段2”、“字段3”)? 请注意,我想要的是字段名“field1”,而不是字段可能的值(我在WindowFunction的键入应用函数中已经有了这个值) 原因:我想对3个聚合使用相同的WindowFunc——这里我添加了window\u start\u time、key\u field\u name、key\u value到结果中 通缉结果

我有一个数据流,它有不同的字段,我想键入这些字段来进行聚合计算(计数、平均值……)

是否有办法在以后的WindowFunc中获取键入字段的名称(“字段1”、“字段2”、“字段3”)? 请注意,我想要的是字段名“field1”,而不是字段可能的值(我在WindowFunction的键入应用函数中已经有了这个值)

原因:我想对3个聚合使用相同的WindowFunc——这里我添加了window\u start\u time、key\u field\u name、key\u 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"))...
//定义窗口函数
公共静态类MyWindowFunc实现WindowFunction{
私有最终字符串键名;
公共MyWindowFunc(字符串键名){
this.keyname=keyname;
}    
...
}
//使用窗口功能
stream.keyBy(“field1”).window().aggregate(AggFunc,新的MyWindowFunc(“field1”))。。。
stream.keyBy(“field2”).window().aggregate(AggFunc,新的MyWindowFunc(“field2”))。。。
stream.keyBy(“field3”).window().aggregate(AggFunc,新的MyWindowFunc(“field3”))。。。
// 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"))...