我正在考虑编写一个accumulo迭代器来返回一个表的百分位数的随机样本。如有任何建议,我将不胜感激。塞纳克斯,克里斯
ttygqcqt1#
稍微扩展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<Key, Value> source, Map<String, String> 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);
显然,你需要增加边界检查等,但你得到的想法。
8zzbczxx2#
您可以扩展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; } }
2条答案
按热度按时间ttygqcqt1#
稍微扩展ben tse的回答,以允许可变的选择量:
当您从代码中调用迭代器时
显然,你需要增加边界检查等,但你得到的想法。
8zzbczxx2#
您可以扩展org.apache.accumulo.core.iterators.filter并随机接受x%的条目。下面的迭代器将随机返回5%的条目。