行范围过滤器与子串比较器 - Hbase

时间:2016-06-28 14:05:02

标签: java hbase

我的Hbase rowkeys设置如下:timestamp-userid

我需要扫描hbase中的所有行并返回userid = 38356644322545651

的所有内容

所以我们有

vid = "38356644322545651";

目前我正在使用一个小的黑客,一个子串比较器:

Scan s = new Scan();
Filter f = new RowFilter(CompareOp.EQUAL, new SubstringComparator(vid));
s.setFilter(f);

这完美无缺!

但是,我质疑检查子字符串是否存在的效率。 如果还有其他rowkeys包含可能导致问题的上述rowkey,也将在未来使用。

所以我找到了一个叫MultiRowRangeFilter的东西。

看起来非常简单。我的实现如下:

Scan s = new Scan();
List<MultiRowRangeFilter.RowRange> lst = new ArrayList<MultiRowRangeFilter.RowRange>();
lst.add(new MultiRowRangeFilter.RowRange("0-" + vid, true, "z-" + vid, true));
s.setFilter(new MultiRowRangeFilter(lst));

这似乎根本不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

简单地说,MultiRowRangeFilter不适合您的情况。
如果担心效率和正确性,我建议RegexStringComparator

    int len = String.valueOf(System.currentTimeMillis()).length();
    String expr = "^[0-9]{" + len + "}" + String.valueOf(seperator) + vid + "$";

    // just kidding... not rely on flag at all.. use 0
    int flag = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
    RegexStringComparator.EngineType engineType = RegexStringComparator.EngineType.JAVA;

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL,
            new RegexStringComparator(expr, flag, engineType));

如果想尝试使用MultiRowRangeFilter,则开始键应为0000000000000-vid,结束键应为9999999999999-vid,代码如下:

    int len = String.valueOf(System.currentTimeMillis()).length();
    String startPrefix = getStrOfRepeatedChar(len, '0'),
            endPrefix = getStrOfRepeatedChar(len, '9');

    String startRow = startPrefix + String.valueOf(seperator) + wantedId,
            endRow = endPrefix + String.valueOf(seperator) + wantedId;
    RowRange rowRange = new RowRange(startRow, true, endRow, true);

    List<RowRange> rowRangeList = new ArrayList<>();
    rowRangeList.add(rowRange);

    Filter multiRowRangeFilter = new MultiRowRangeFilter(rowRangeList);

但结果仍然不正确,因为它会在表格中显示所有结果。