2015-02-10 52 views
3

我有一个大数据文件(1TB)的数据导入到BigQuery。每行包含一个键。在导入数据并创建我的PCollection以导出到BigQuery时,我想确保不会根据此键值导入重复记录。在我的Java程序中做这件事最有效的方法是什么?使用数据流删除重复

感谢

回答

2

在数据流GroupByKey概念允许任意分组,它可以被利用来从PCollection删除重复项。

最通用的办法解决这个问题将是:从源文件中读取

  • ,产生的输入记录的PCollection,
  • 使用帕尔多转变为独立的键和值,产生 PCollection KV的,
  • 在其上执行一个操作GroupByKey ,产生KV>的PCollection,
  • 使用帕尔变换选择哪个值映射到给定的密钥 小号HOULD被写入,从而产生的KV PCollection,
  • 使用帕尔变换对数据进行格式化用于写入,
  • 最后,写 结果至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>. 
    }})); 
+0

嗨 - 我能得到RemoveDuplicates变换正常工作。我想知道将数据流报告中的重复项数量抑制或作为多重输出重复项的关键字会涉及什么? – 2015-03-06 18:31:01