DoFn.Context.output() 是否复制对象?

Does DoFn.Context.output() make a copy of the object?

DoFn.Context.output() 是否复制对象?

调用输出后重用一个对象安全吗?例如,以下代码会输出 10 条具有相同时间戳的记录还是 10 条具有不同时间戳的记录?

public void processElement(DoFn<LogMessage, Event>.ProcessContext c) throws Exception {
  Event e = new Event();
  for (int i = 0; i < 10; i++) {
    e.setTimestampMs(i);
    c.output(e);
  }
}

不,通常在调用 c.output(elem) 后修改 elem 是不安全的。

这是因为 elem 没有复制就传递给了消费者(为了提高效率)。消费者可能希望在处理之前缓冲其输入元素 (c.element())。修改输出 elem 会影响缓冲的元素。