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

时间:2016-08-11 12:30:06

标签: java scala mapreduce hbase

我有带行密钥的HBase表,其中包含文本ID和时间戳,如下一行:

"19999"

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

由于

3 个答案:

答案 0 :(得分:5)

模糊行方法对于这种需求是有效的,并且当数据很大时: 正如此article所解释的那样 FuzzyRowFilter将行键和掩码信息作为参数。

在上面的示例中,如果我们想要查找上次登录的用户并且行密钥格式为validates_inclusion_of :my_bill, in: Transaction.autocomplete_names, message: "Bill name not found in your account, please try again" (其中userId_actionId_timestamp具有固定长度的4个字符),我们正在寻找模糊行键for是userId。这转换为FuzzyRowKey的以下参数:

????_login_

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

答案 1 :(得分:-2)

让我们说你以某种方式最终将你的行放在像List或RDD这样的monadic可遍历结构中。现在,您希望只包含id = "string_id2"timestamp > 1470913345000的字符串。

现在这里有什么问题?只需根据这两个标准过滤掉可行的monadic结构。

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

答案 2 :(得分:-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)

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