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和时间戳超过某个值的结果?
谢谢
模糊行方法对于这种要求是有效的,并且当数据很大时:如本文所解释的, 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)
感谢所有帮助寻找解决方案的人。
| 归档时间: |
|
| 查看次数: |
7976 次 |
| 最近记录: |