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



我有一个包含行键的HBase表,它由文本ID和时间戳组成,如下:

...
string_id1.1470913344067
string_id1.1470913345067
string_id2.1470913344067
string_id2.1470913345067
...

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

谢谢

模糊行方法对于这种需求是有效的,当数据是巨大的:正如本文所解释的FuzzyRowFilter接受行键和掩码信息作为参数。

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

FuzzyRowFilter rowFilter = new FuzzyRowFilter(
 Arrays.asList(
  new Pair<byte[], byte[]>(
    Bytes.toBytesBinary("x00x00x00x00_login_"),
    new byte[] {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0})));

建议通过hbase-the-definitive指南->客户端API:高级功能

假设您最终将行置于单元可遍历结构(如List或RDD)中。现在,您只想要包含id = "string_id2"timestamp > 1470913345000的字符串。

现在问题是什么?只需根据这两个条件过滤可遍历的单元结构。

val filtered = listOrRddOfLines
  .map(l => {
    val idStr :: timestampStr :: Nil = l.split('.').toList
    (idStr, timestampStr.toLong)
  })
  .filter({
    case (idStr, timestamp) => idStr.equals("string_id2") && (timestamp > "1470913345000".toLong)
  })

我通过使用过滤器来解决这个问题:
- 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)

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

最新更新