使用数据流删除重复项

时间:2015-02-10 16:01:03

标签: google-cloud-dataflow

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

由于

3 个答案:

答案 0 :(得分:7)

答案 1 :(得分:2)

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

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

  • 从源文件中读取,生成输入记录的PCollection,
  • 使用ParDo转换来分隔键和值,产生一个 PCV选择KV,
  • 执行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>.
    }}));

答案 2 :(得分:0)