我正在通过hbase客户端读取hbase手机标签。
我通过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操作(见下面的代码)并尝试访问标记时,没有返回任何值。
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的一个限制,即get查询不应返回标记?
1条答案
按热度按时间vd8tlhqk1#
发生这种情况是因为hbase单元标记不供客户端使用。当请求用户是超级用户时,它们将返回给客户端。不建议依赖于在客户端读取单元标记。