在最新的SDK之前,我依赖于能够在我的DoFn的startBundle中访问我的sideInput。我不确定重构的历史,但我现在似乎遇到了这样的问题。
基本上我有一个我想在process()方法中处理的数组,并且数组的大小合理,适合内存。
期望在startBundle中访问sideInput是否有效?如果是这样,如果startBundle被发送一个Context而不是ProcessContext,我怎么能这样做?
示例:
@Override
public void startBundle(DoFn<KV<String, Iterable<String>>, String>.Context c) throws Exception {
uniqueIds = Lists.newArrayList(c.sideInput(iterableView));
super.startBundle(c);
}
答案 0 :(得分:1)
历史记录在这里解释:Why did #sideInput() method move from Context to ProcessContext in Dataflow beta
您是否需要对侧输入进行任何处理以准备在processElement中使用?如果没有,那么我建议只使用View.asList()或View.asMap()并直接在processElement()中调用它 - 数据流将在可能的情况下进行缓存以使其便宜。 (注意View.asList()目前在Github上可用,并将在下一个Maven版本中发布。)
如果您需要对侧输入进行处理,并且使用(默认)GlobalWindow,则可以从processElement()中懒惰地初始化局部变量。但是,如果您使用的是Window.into(),那么每次元素的窗口更改时,您都需要使该缓存无效。