如何在Apache Beam中使用ParDo和DoFn创建读变换

时间:2017-09-28 13:12:53

标签: google-cloud-dataflow apache-beam

根据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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

DoFn执行逐元素处理。如上所述,ParDo.of(new ReadFn())将具有PTransform<PCollection<PBegin>, PCollection<Event>>类型。具体来说,ReadFn表示它采用类型为PBegin元素,并返回0个或更多类型为Event的元素。

相反,您应该使用实际的Read操作。有a variety provided。如果您要使用一组特定的内存中集合,也可以使用Create

如果您需要创建自定义来源,则应使用Read transform。由于您使用的是计时器,因此您可能希望创建一个无界源(元素流)。