Google cloud dataflow 使用Apache Beam数据流整合来自CDC记录的PCollection的单行最新值

Google cloud dataflow 使用Apache Beam数据流整合来自CDC记录的PCollection的单行最新值,google-cloud-dataflow,apache-beam,cdc,Google Cloud Dataflow,Apache Beam,Cdc,更改数据捕获CDC记录不会具有记录中列的所有值。对于记录的主键,比如R1,我们可以用CDC时间戳为R1收集CDC记录。 例如,如果记录R1具有列C1、C2、C3、C4和时间戳 CDC的记录将被删除 R1,C1.1,-,C3.1,-,10:02 R1,C1.2,C2.2,-,C4.2,10:03 R1,-,C2.3,-,C4.3,10:04 R2,C2.1,-,C3.1,-,10:03 当束流管道处理时,我需要得到如下输出 PCollection包含 R1,C1.2,C2.3,C3.1,C4.3,

更改数据捕获CDC记录不会具有记录中列的所有值。对于记录的主键,比如R1,我们可以用CDC时间戳为R1收集CDC记录。 例如,如果记录R1具有列C1、C2、C3、C4和时间戳

CDC的记录将被删除 R1,C1.1,-,C3.1,-,10:02 R1,C1.2,C2.2,-,C4.2,10:03 R1,-,C2.3,-,C4.3,10:04 R2,C2.1,-,C3.1,-,10:03

当束流管道处理时,我需要得到如下输出 PCollection包含 R1,C1.2,C2.3,C3.1,C4.3,10:04 R2,C2.1,-,C3.1,-,10:03


任何提示都将不胜感激!谢谢。

我不确定我是否正确理解了你的问题

那怎么办

1首先将其转换为KV对:

R1: C1.1,--,C3.1,--,10:02
R1: C1.2,C2.2,--,C4.2,10:03
R1: --,C2.3,--,C4.3,10:04
R2: C2.1,--,C3.1,--,10:03
2然后执行GroupBykey:

R1-> C1.1,--,C3.1,--,10:02
     C1.2,C2.2,--,C4.2,10:03
     --,C2.3,--,C4.3,10:04
R2-> C2.1,--,C3.1,--,10:03

3然后针对每个键,处理多个元素并将其转换为一个

感谢黄若云为我指明了正确的方向。。。如果其他人对解决类似问题感兴趣,请附加psuedo代码

CreateKeyValue和ConsolidateCDC的签名如下:


这是批处理还是流式处理?这是批处理。每个R都是一个CDC记录,它只包含基本记录的更新列,其中R1是主键。
PCollection<TableRow> rowsFromBigQuery =
           pipeline.apply(
                BigQueryIO.readTableRows()
                    .fromQuery(QUERY)
                    .withoutValidation()
                    .usingStandardSql()
                   .withMethod(Method.DIRECT_READ));
                   //.withReadOptions(tableReadOptions));
// Seggregate by keys
PCollection<KV<String, TableRow>> rowByKeys =
            rowsFromBigQuery.apply("Seggregating by row keys", ParDo.of(new CreateKeyValue()));
// Group by keys
PCollection<KV<String, Iterable<TableRow>>> groupByKeys =
            rowByKeys.apply("Grouping by row keys", GroupByKey.<String, TableRow>create());
// Consolidate CDC
PCollection<TableRow> cdcConsolidatedRows =
            groupByKeys.apply("Consolidate CDC by row keys", ParDo.of(new ConsolidateCDC()));
static class ConsolidateCDC extends DoFn <KV<String, Iterable<TableRow>>, TableRow> and static class CreateKeyValue extends DoFn<TableRow, KV<String, TableRow>>