HBase Cell标签在Scan中返回,但在Get中没有

时间:2016-08-22 14:51:26

标签: hbase

我正在通过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的限制,不能从获取查询返回标记?

1 个答案:

答案 0 :(得分:1)

这是因为HBase Cell标签不供客户端使用。当请求用户是超级用户时,它们将返回到客户端。不建议依赖于客户端读取单元标签。