java—我正在考虑编写一个accumulo迭代器来返回一个表的百分位数的随机样本

3okqufwl  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(283)

我正在考虑编写一个accumulo迭代器来返回一个表的百分位数的随机样本。
如有任何建议,我将不胜感激。
塞纳克斯,
克里斯

ttygqcqt

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);

显然,你需要增加边界检查等,但你得到的想法。

8zzbczxx

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;
    }
}

相关问题