我有带行密钥的HBase表,其中包含文本ID和时间戳,如下一行:
"19999"
如何过滤HBase扫描(在Scala或Java中)以获得某些字符串ID和时间戳超过某个值的结果?
由于
答案 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)
感谢所有帮助寻找解决方案的人。