我正在编写一条管道,以将数据从一个源复制到另一个源。有关数据源的信息存储在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对象中使用管道,因为它无法序列化/反序列化。
有什么办法可以实现预期的行为?