我正在编写一个Accumulo迭代器来返回一个表的百分位数的随机样本

我正在编写一个Accumulo迭代器来返回一个表的百分位数的随机样本。

我将不胜感激任何建议。

Thnaks,

克里斯

您可以扩展org.apache.accumulo.core.iterators.Filter并随机接受x%的条目。 以下迭代器将随机返回5%的条目。

import java.util.Random; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.iterators.Filter; public class RandomAcceptFilter extends Filter { private Random rand = new Random(); @Override public boolean accept(Key k, Value v) { return rand.nextDouble() < .05; } } 

略微扩展Ben Tse的答案以允许可变数量的选择:

 import java.util.Random; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.iterators.Filter; public class RandomAcceptFilter extends Filter { private Random rand = new Random(); private double percentToAllow; public static final String RATIO = "ratio"; public static final String DEFAULT = "0.05"; @Override public void init(SortedKeyValueIterator source, Map options, IteratorEnvironment env) throws IOException { super.init(source, options, env); String option = options.containsKey(RATIO) ? options.get(RATIO) : DEFAULT; this.percentToAllow = Double.parseDouble(option); } @Override public boolean accept(Key k, Value v) { return rand.nextDouble() < this.percentToAllow; } } 

然后,当您从代码中调用迭代器时,您就可以执行此操作

 IteratorSetting itr = new IteratorSetting(15, "myIterator", RandomAcceptFilter.class); itr.addOption(RandomAcceptFilter.RATIO, "0.20"); myScanner.addScanIterator(itr); 

显然你需要添加边界检查等,但你明白了。