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

时间:2018-12-07 07:23:22

标签: apache-flink flink-streaming

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

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的apply函数的键中有了此值)。

原因:我想对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)

1 个答案:

答案 0 :(得分:1)

否,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"))...