在DoFn中访问管道

时间:2019-05-10 18:38:25

标签: apache-beam

我正在编写一条管道,以将数据从一个源复制到另一个源。有关数据源的信息存储在db(BQ)中。我如何使用该数据动态构建读写端点?

我试图将Pipeline对象传递给我的自定义DoFn,但是无法序列化。后来,我尝试在传递的视图上调用方法getPipeline(),但效果不佳。 -实际上是预期的

我无法事先知道需要序列化的所有表,因此必须从db(或任何其他来源)读取所有数据。

// builds some random view
PCollectionView<IdWrapper> idView = ...;

// reads tables meta and replicates data per each table
pipeline.apply(getTableMetaEndpont().read())
    .apply(ParDo.of(new MyCustomReplicator(idView)).withSideInputs(idView))

private static class MyCustomReplicator extends DoFn<TableMeta, TableMeta> {
    private final PCollectionView<IdWrapper> idView;

    private DataReplicator(PCollectionView<IdWrapper> idView) {
      this.idView = idView;
    }

    // TableMeta {string: sourceTable, string: destTable}
    @ProcessElement
    public void processElement(@Element TableMeta tableMeta, ProcessContext ctx) {
      long id = ctx.sideInput(idView).getValue();

      // builds read endpoint which depends on table meta
      // updates entities
      // stores entities using another endpoint
      idView
          .getPipeline()
          .apply(createReadEndpoint(tableMeta).read())
          .apply(ParDo.of(new SomeFunction(tableMeta, id)))
          .apply(createWriteEndpoint(tableMeta).insert());

      ctx.output(tableMetadata);
    }
}


我希望它能复制TableMeta指定的数据,但是我无法在DoFn对象中使用管道,因为它无法序列化/反序列化。

有什么办法可以实现预期的行为?

0 个答案:

没有答案
相关问题