如何在Java中将值修改为Tuple2

时间:2019-01-19 14:34:29

标签: java scala apache-flink final accumulator

我正在使用折叠功能中的累加器。我想更改累加器的值。

我的函数看起来像这样:

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;

2 个答案:

答案 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;