如何按部分行键筛选hbase扫描?

wljmcqd8  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(409)

我有一个带有行键的hbase表,它由文本id和时间戳组成,如下所示:

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

我如何过滤hbase的扫描(在scala或java中)以获得字符串id和时间戳大于某个值的结果?
谢谢

ghhaqwfi

ghhaqwfi1#

模糊行方法对于这种需求是有效的,并且当数据量很大时:正如本文所解释的,模糊行过滤器将参数作为行键和掩码信息。
在上面的例子中,如果我们想找到最后登录的用户,并且行键格式是 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})));

建议您阅读hbase的最终指南-->客户端api:高级功能

4dc9hkyq

4dc9hkyq2#

我通过使用以下过滤器解决问题:

  • PrefixFilter (我把行键的第一部分放到这个过滤器中。在我的例子中-string id,例如“string\u id1.”)
  • RowFilter (我提出了两个参数:第一- CompareOp.GREATER_OR_EQUAL ,second-具有必要时间戳的所有行键,例如“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)

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

i86rm4rw

i86rm4rw3#

假设你的行以某种方式结束在一元可遍历结构中,比如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)
  })

相关问题