使用数据流删除重复项

Using Dataflow to Remove Duplicates

我有一个大型数据文件 (1 TB) 的数据要导入 BigQuery。每行包含一个键。在导入数据并创建我的 PCollection 以导出到 BigQuery 时,我想确保我不会导入基于此键值的重复记录。在我使用 Dataflow 的 Java 程序中执行此操作的最有效方法是什么?

谢谢

以下可能值得一看

https://cloud.google.com/dataflow/java-sdk/JavaDoc/com/google/cloud/dataflow/sdk/transforms/RemoveDuplicates

Dataflow 中的 GroupByKey 概念允许任意分组,可以利用它从 PCollection 中删除重复键。

解决此问题的最通用方法是:

  • 从您的源文件中读取,生成输入记录的 PCollection,
  • 使用 ParDo 转换来分离键和值,生成 P 的 KV 集合,
  • 执行GroupByKey操作 在其上,生成 KV>,
  • 的 PCollection
  • 使用 ParDo 转换 select 哪个值映射到给定的键 应该写成,产生 KV 的 PCollection,
  • 使用 ParDo 转换格式化写入数据,
  • 最后,写 结果到 BigQuery 或任何其他接收器。

其中一些步骤可能是 省略,如果你正在解决泛型的特殊情况 问题。

特别是,如果将整个记录视为一个键,则问题可以简化为 运行 Count 转换并迭代生成的 PCollection。

下面是 GroupByKey 的大致代码示例:

PCollection<KV<String, Doc>> urlDocPairs = ...;
PCollection<KV<String, Iterable<Doc>>> urlToDocs =
    urlDocPairs.apply(GroupByKey.<String, Doc>create());
PCollection<KV<String, Doc>> results = urlToDocs.apply(
    ParDo.of(new DoFn<KV<String, Iterable<Doc>>, KV<String, Doc>>() {
      public void processElement(ProcessContext c) {
        String url = c.element().getKey();
        Iterable<Doc> docsWithThatUrl = c.element().getValue();
        // return a pair of url and an element from Iterable<Doc>.
    }}));

可以使用org.apache.beam.sdk.transforms.Reshuffle

https://beam.apache.org/releases/javadoc/2.0.0/index.html?org/apache/beam/sdk/transforms/Reshuffle.html

https://www.tabnine.com/code/java/classes/org.apache.beam.sdk.transforms.Reshuffle