我正在使用折叠功能中的累加器。我想更改累加器的值。
我的函数看起来像这样:
public Tuple2<String, Long> fold(Tuple2<String, Long> acc, eventClass event)
{
acc._1 = event.getUser();
acc._2 += event.getOtherThing();
return acc
}
对我来说这应该是有效的,因为我要做的就是更改累加器的值。但是我得到的是Cannot assign value to final variable _1
。与_2
相同。为什么acc
的这些属性是final?如何为它们分配值?
快速编辑:
我本来可以避免生锈返回一个新的元组,但这在我看来return new Tuple2<String, Long>(event.getUser(), acc._2 + event.getOtherThing());
flink框架的解决方案: 使用flink中定义的Tuple2。使用
导入import org.apache.flink.api.java.tuple.Tuple2;
然后与
一起使用acc.f0 = event.getUser();
acc.f1 += event.getByteDiff();
return acc;
答案 0 :(得分:3)
我不知道您仍然使用哪种Tuple2,但是我认为它是一个scala Tuple2。 Scala Tuple2是不可变的。您不能更改不可变对象的值,必须重新创建它。 为什么? Scala Tuple2是功能编程“数据结构”,因此,由于所有功能编程概念,它都试图减少副作用。 您可以使用.copy函数根据需要重新创建它。 以下是代码示例:
@Test
public void test() {
Tuple2<String,Long> tuple = new Tuple2<>("a",1l);
Tuple2<String,Long> actual = tuple.copy(tuple._1,tuple._2+1);
Tuple2<String,Long> expected = new Tuple2<>("a",2l);
assertEquals(actual,expected);
}
答案 1 :(得分:2)
我不知道您正在使用哪个Tuple2
。如何返回一个新对象:
Tuple2<String, Long> tuple = new Tuple2<String, Long>();
tuple._1 = event.getUser();
tuple._2 = event.getOtherThing() + acc._2;
return tuple;