如何过滤部分行键扫描HBase?

Vit*_*ich 7 java hbase scala mapreduce

我有带行键的HBase表,它由文本ID和时间戳组成,如下所示:

...
string_id1.1470913344067
string_id1.1470913345067
string_id2.1470913344067
string_id2.1470913345067
...
Run Code Online (Sandbox Code Playgroud)

如何过滤HBase扫描(在Scala或Java中)以获得某些字符串ID和时间戳超过某个值的结果?

谢谢

Ram*_*ram 5

模糊行方法对于这种要求是有效的,并且当数据很大时:如本文所解释的, FuzzyRowFilter将参数行键和掩码信息作为参数.

在上面的例子中,如果我们想要找到最后登录的用户并且行键格式是userId_actionId_timestamp(其中userId有4个字符的固定长度),我们正在寻找的模糊行键是????_login_.这转换为FuzzyRowKey的以下参数:

FuzzyRowFilter rowFilter = new FuzzyRowFilter(
 Arrays.asList(
  new Pair<byte[], byte[]>(
    Bytes.toBytesBinary("\x00\x00\x00\x00_login_"),
    new byte[] {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0})));
Run Code Online (Sandbox Code Playgroud)

建议通过hbase-the-definitive guide - > Client API:Advanced Features


Vit*_*ich -2

我通过使用过滤器解决了我的问题:
- PrefixFilter(我将行键的第一部分放入此过滤器。在我的情况下 - 字符串 ID,例如“string_id1。”)
- RowFilter(我放了两个参数:第一个 - CompareOp.GREATER_OR_EQUAL,第二个 - 所有我的行键带有必要的时间戳,例如“string_id1.1470913345000”

结果,我得到了带有行键的所有单元格,string_id如果第一部分是必需的,并且时间戳大于或等于我在第二部分中放入过滤器的时间戳。这正是我想要的。

代码片段:

val s = new Scan()
s.addFamily(family.getBytes)
val filterList = new FilterList()
filterList.addFilter(new PrefixFilter(Bytes.toBytes(prefixOfRowKey)))
filterList.addFilter(new RowFilter(CompareOp.GREATER_OR_EQUAL, new BinaryComparator(valueForBinaryFilter.getBytes())))
s.setFilter(filterList)
val scanner = table.getScanner(s)
Run Code Online (Sandbox Code Playgroud)

感谢所有帮助寻找解决方案的人。