Flink DataSet API:GroupBy无法正常工作吗?

时间:2016-01-13 09:48:35

标签: java apache-flink

在我的Flink Java程序中,我使用GroupBy-Operator,如下所示:

dataSet.groupBy(new KeySelector<myObject, Tuple2<Tuple2<Integer, Integer>, Integer>>() {
    private static final long serialVersionUID = 5L;
    Tuple2<Tuple2<Integer, Integer>, Integer> groupingKey = new Tuple2<Tuple2<Integer, Integer>, Integer>();

        public Tuple2<Tuple2<Integer, Integer>, Integer> getKey(myObject s) {
            groupingKey.setField(s.getPosition(), 0);
            groupingKey.setField(s.getBand(), 1);
            return groupingKey;
        }
    })
    .reduceGroup(reduceFunction);

getPosition()返回Tuple2<Integer, Integer>getBand()返回int

我想在两个值上对数据集进行分组。如果我有6个位置和4个波段,我想获得24个不同的组,并且每个组独立使用groupReduce - 函数。但是目前我的结果组似乎包含了乐队和位置的各种值。我在groupReduce函数中检查了这个:

if (this.band == null) {
    this.band = myObject.getBand();
}
if (this.band != myObject.getBand()) {
    System.out.println("The band should be " + this.band + " but is: " + myObject.getBand());

此外,我的结果文件中还有值表示分组存在问题。分组是否可能在我的情况下不起作用?或者这可能只是我代码中另一个潜在错误的结果?

1 个答案:

答案 0 :(得分:1)

我认为您在GroupReduceFunction的支票无效。 对于不同的组,可以多次调用GroupReduceFunction.reduce()this.bandGroupReduceFunction的成员变量,我假设您未在this.band方法结束时重置reduce()

因此,this.band仅在null的第一次调用中reduce()。在第二次呼叫开始时,this.band将被初始化,并且不会被设置为当前组的频段。因此,以下检查将失败。