Google cloud dataflow 使用Apache Beam数据流整合来自CDC记录的PCollection的单行最新值
更改数据捕获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:03Google 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,
任何提示都将不胜感激!谢谢。我不确定我是否正确理解了你的问题 那怎么办 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>>