hbase 扫描器 .next() returns 空

hbase scanner .next() returns null

我正在 hbase 中扫描 md5 字符串,如果找到字符串,我必须执行一些操作。 问题是,如果我第一次检查它,它 returns 为真(并且 log 是值),但是当我在 if 或 for 语句中使用相同的表达式时,我得到了一个错误的结果。

        Scan scanCookiesData = new Scan();

        scanCookiesData.addColumn(Bytes.toBytes("md5data"), Bytes.toBytes("md5data"));
        ResultScanner scannerCookiesData = dbHelper.getTable("userInfo").getScanner(scanCookiesData);
            if (scannerCookiesData.next() != null) {
            response.getWriter().println("if (scannerCookiesData.next() != null)");

            for (Result r = scannerCookiesData.next(); r != null; r = scannerCookiesData.next()) {
                response.getWriter().println("INSIDE FOR!!!");

                if (md5data.equals(Bytes.toString(r.value()))) {
                    // Here we will assign ID to the user.
                    response.getWriter().println(assignID(Bytes.toString(r.value())));
                    response.setStatus(200);
                } else {
                    response.getWriter().println("ELSE");
                }
            }
        } else {
            response.getWriter().println(createNewUser(json));
            response.setStatus(200);
        }

在这段代码中,首先如果它得到"true",但是没有调用in for,因为它会显示"false"..但是scanner不是null(在db中是md5字符串), 所以它应该得到 "true"..

我现在能想到的最佳原因是只找到了 1 个与您的查询相符的结果。错误是在你身边调用 next() 的误解:调用 returns 下一个值(如果存在)并向前移动一步,没有办法去 返回.

通过调用 if (scannerCookiesData.next() != null),您实际上检索了该结果,并跳至下一个(如果存在)。 这意味着您实际上从未使用过您的第一个结果,除了 null 检查,因为它没有存储在任何地方。当您到达 for 循环时,您将开始使用第二个结果,我认为这在您的情况下不存在。

当没有找到扫描仪的进一步结果时,将返回 null 而不是 Result 对象,表示结果集结束。