4

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

谢谢

4

3 回答 3

7

以下可能值得一看

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

于 2015-02-10T18:15:36.790 回答
3

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

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

  • 从源文件中读取,生成输入记录的 PCollection,
  • 使用 ParDo 变换来分离键和值,产生 KV 的 PCollection,
  • 对其执行 GroupByKey 操作,生成 KV> 的 PCollection,
  • 使用 ParDo 变换来选择应该写入映射到给定键的值,产生 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>.
    }}));
于 2015-02-10T18:21:06.450 回答