根据Apache Beam documentation推荐的方式
编写简单的资源是使用Read Transforms和ParDo
。不幸的是,Apache Beam文档让我失望了。
我正在尝试编写一个简单的无界数据源,它使用ParDo
发出事件,但编译器一直在抱怨DoFn
对象的输入类型:
message: 'The method apply(PTransform<? super PBegin,OutputT>) in the type PBegin is not applicable for the arguments (ParDo.SingleOutput<PBegin,Event>)'
我的尝试:
public class TestIO extends PTransform<PBegin, PCollection<Event>> {
@Override
public PCollection<Event> expand(PBegin input) {
return input.apply(ParDo.of(new ReadFn()));
}
private static class ReadFn extends DoFn<PBegin, Event> {
@ProcessElement
public void process(@TimerId("poll") Timer pollTimer) {
Event testEvent = new Event(...);
//custom logic, this can happen infinitely
for(...) {
context.output(testEvent);
}
}
}
}
答案 0 :(得分:1)
DoFn
执行逐元素处理。如上所述,ParDo.of(new ReadFn())
将具有PTransform<PCollection<PBegin>, PCollection<Event>>
类型。具体来说,ReadFn
表示它采用类型为PBegin
的元素,并返回0个或更多类型为Event
的元素。
相反,您应该使用实际的Read
操作。有a variety provided。如果您要使用一组特定的内存中集合,也可以使用Create
。
如果您需要创建自定义来源,则应使用Read transform。由于您使用的是计时器,因此您可能希望创建一个无界源(元素流)。