在GCP数据流作业JAVA中创建BloomFilter

时间:2019-11-16 19:21:33

标签: java apache-beam dataflow bloom-filter

我有一些记录称为“ ID”(大约20亿行字符串)。我想在GCP数据流作业中基于这些ID创建一个BloomFilter。然后,我想遍历另一个称为“ newID”的数据记录,以检查newID是否在ID内。

我的想法是将这些ID的PCollectionView作为Iterable获得。然后,基于此PCollectionView,我将创建一个BloomFilter,并且此BloomFilter将被视为所有实例的Singleton。这是最好的方法吗?

如果是,我如何基于PCollectionView>创建全局BloomFilter并将其用于所有实例?我知道DoFn的sideInput;但是,在我生成BloomFilter的DoFn中,没有输入。我只想迭代PCollectionView>并生成BloomFilter。

以下是代码:

// Generate the PCollectionView<Iterable<String>> from the IDs file;
PCollectionView<Iterable<String>> IDs = p.apply(TextIO.read("IDs file")).apply(View.asIterable());

// I don't know how I should write the code to generate this BloomFilter View. I tried the code below.
PCollectionView<BloomFilter<String>> bloomFilter = ???
PCollectionView<BloomFilter<String>> bloomFilter = p.apply(ParDo.of(new MakeBF()).withSideInput(IDs));

// Like here, I don't know what I should use as input for DoFn.
private class MakeBF extends DoFn<???, BloomFilter<String>> {
Iterable<String> IDView = c.sideInput(IDs);
BloomFilter bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), (long) 2E9, 0.001)
IDView.forEach(id -> bloomFilter.put(id))
}

非常感谢。

0 个答案:

没有答案