首页 > 解决方案 > BigTable CheckAndPut CompareOp.Greater 总是放置

问题描述

无论 GREATER compareOp 是什么,checkAndPut 方法似乎总是放置值。下面的代码说明了这个问题,因为值“a”按字典顺序小于“bbbbbb”,人们会认为 CheckAndPut 不会放入场景中,但它确实存在。

我在用

<groupId>com.google.cloud.bigtable</groupId>
<artifactId>bigtable-hbase-1.x-hadoop</artifactId>
<version>1.3.0</version>

下面是代码:

        byte[] key = "key17".getBytes();
        byte[] smaller = "a".getBytes();
        byte[] larger = "bbbbbb".getBytes();
        byte[] COL_FAMILY = "family".getBytes();
        byte[] COL_QUAL = "qual".getBytes();

        /** if null, we set it here **/
        boolean doRun = table.checkAndPut(key, COL_FAMILY, COL_QUAL, null,
                new Put(key).addColumn(COL_FAMILY, COL_QUAL, smaller));
        System.out.println("WRITE OCCURRED: " + doRun);

        Result rr = table.get(new Get(key).addFamily(COL_FAMILY));
        byte[] res = rr.getValue(COL_FAMILY, COL_QUAL);
        System.out.println("BEFORE STORED VAL: " + new String(res));

        // should NOT put and return false since "a" is NOT greater than
        // "bbbbbb"
        doRun = table.checkAndPut(key, COL_FAMILY, COL_QUAL, CompareOp.GREATER, larger,
                new Put(key).addColumn(COL_FAMILY, COL_QUAL, larger));

        rr = table.get(new Get(key).addFamily(COL_FAMILY));
        res = rr.getValue(COL_FAMILY, COL_QUAL);
        System.out.println("AFTER STORED VAL: " + new String(res));
        System.out.println("WRITE OCCURRED: " + doRun);

输出

WRITE OCCURRED: true
BEFORE STORED VAL: a
AFTER STORED VAL: bbbbbb
WRITE OCCURRED: true

标签: bigtablegoogle-cloud-bigtable

解决方案


检查 HBASE 文档后,提供的示例阐明了实际比较的内容

GREATER operator means expected value > existing <=> add the put.

我的解释正好相反,所以没有问题。


推荐阅读