В моей программе 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());
Кроме того, в моем итоговом файле есть значения, указывающие на проблему с группировкой. Возможно ли, что в моем случае группировка не работает? Или это могло быть просто следствием еще одной потенциальной ошибки в моем коде?
band
является переменной-членом вашегоGroupReduceFunction
.reduce
метод одного и того жеGroupReduceFunction
объекта может вызываться несколько раз для разных групп (но только один раз для каждой группы). Вы сбросилиthis.band
на ноль (кстати, почему ноль, это должно бытьint
, нет?) В конце методаreduce
? В качестве альтернативы вы можете сделатьband
локальной переменной вreduce()
. - person Fabian Hueske   schedule 13.01.2016this.band
действительно была переменной-членом моего пользовательского классаGroupReduceFunction
, но должна была быть в методеreduce()
. - person Robin Ellerkmann   schedule 13.01.2016groupReduce
? - person Fabian Hueske   schedule 13.01.2016