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

在GCP数据流作业JAVA中创建BloomFilter,java,apache-beam,dataflow,bloom-filter,Java,Apache Beam,Dataflow,Bloom Filter,我有一些记录叫做“id”(大约20亿行字符串)。我想在GCP数据流作业中基于这些ID创建一个BloomFilter。然后,我想迭代另一个名为“newIDs”的数据记录,以检查newIDs是否在IDs中 我的想法是将这些ID的PCollectionView作为一个Iterable。然后,基于这个PCollectionView,我将创建一个BloomFilter,这个BloomFilter将被视为所有实例的单例。这是最好的方法吗 如果是,如何基于PCollectionView>创建全局BloomFi

我有一些记录叫做“id”(大约20亿行字符串)。我想在GCP数据流作业中基于这些ID创建一个BloomFilter。然后,我想迭代另一个名为“newIDs”的数据记录,以检查newIDs是否在IDs中

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

如果是,如何基于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))
}
//从IDs文件生成PCollectionView;
PCollectionView-IDs=p.apply(TextIO.read(“IDs文件”)).apply(View.asIterable());
//我不知道应该如何编写代码来生成这个BloomFilter视图。我尝试了下面的代码。
PCollectionView bloomFilter=???
PCollectionView bloomFilter=p.apply(ParDo.of(new MakeBF()).withSideInput(id));
//就像这里一样,我不知道应该使用什么作为DoFn的输入。

私有类MakeBF扩展了dofn如果您说您想“检查newid是否在id中”“。请注意,bloom筛选器可能会给您带来误报。我知道存在FPP,但我只想确定不在设置范围内的。我认为BF非常适合我。您的bloom筛选器的大小是多少?是否会在管道运行时对其进行修改?您说您想要”检查新ID是否在ID内。请注意,bloom筛选器可能会给您带来误报。我知道存在FPP,但是,我只想确定不在集合内的那些。我认为BF非常适合我。您的bloom筛选器的大小是多少?在管道运行时是否会对其进行修改?