我正在通过HBase客户端阅读HBase Cell标签。
我通过Put.addImmutable(cf,col,version,value,tags)编写标签。
我可以通过扫描HBase验证这些标签是否已正确写入:
Scan s = new Scan();
s.setFilter(new PageFilter(100));
ResultScanner scanner = table.getScanner(s);
Result[] results = scanner.next(100);
Arrays.stream(results).forEach(r -> {
CellScanner cs = r.cellScanner();
try {
while(cs.advance()) {
byte tagValue = ((KeyValue)cs.current()).getTags()
.stream()
.filter(tag -> tag.getType() == MY_SPECIAL_TAG_TYPE)
.findFirst().orElseThrow(() -> new RuntimeException("No tag found"))
.getValue();
System.out.println("tagValue=" + Bytes.toString(tagValue));
}
} catch(IOException e) {
}
});
我总是得到我在看台上设置的正确值。
然而,当我知道存在的行键时,我知道存在 - 请参阅下面的代码 - 并尝试访问标记,我没有返回任何值。
Get g = new Get(Bytes.toBytes("myKey");
Result r = table.get(g);
CellScanner cs = r.cellScanner();
try {
while(cs.advance()) {
byte tagValue = ((KeyValue)cs.current()).getTags()
.stream()
//.filter(tag -> tag.getType() == MY_SPECIAL_TAG_TYPE)
.findFirst().orElseThrow(() -> new RuntimeException("No tag found"))
.getValue();
System.out.println("tagValue=" + Bytes.toString(tagValue));
}
} catch(IOException e) {
}
}
我是否犯了错误,或者这是HBase客户端API的限制,不能从获取查询返回标记?
答案 0 :(得分:1)
这是因为HBase Cell标签不供客户端使用。当请求用户是超级用户时,它们将返回到客户端。不建议依赖于客户端读取单元标签。