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
会影响缓冲的元素。
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
会影响缓冲的元素。