gpt4 book ai didi

java - Accumulo 范围 - 不包含结束键

转载 作者:行者123 更新时间:2023-12-02 10:36:17 30 4
gpt4 key购买 nike

我正在学习 Accumulo,似乎无法让 Range 中指定的结束键包含在内。我的代码如下。我尝试在 Range 中将 endKeyInclusive 显式设置为 true,但这没有帮助。

BatchWriter writer = conn.createBatchWriter("table", config);

List<String> deterTimes = new ArrayList<>();

String rowId = "3015551212<ll>";
String columnFamily = "deter";
for (int i = 0; i < 10; i++) {
String deterTime = "20181112:21:46:33" + i;
deterTimes.add(deterTime);
writer.addMutation(makeRecord(rowId, columnFamily, deterTime, "DETER" + i));
}

writer.flush();
writer.close();

Scanner scan = conn.createScanner("table", auths);

Key startKey = new Key(rowId.getBytes(), columnFamily.getBytes(), deterTimes.get(1).getBytes());
Key endKey = new Key(rowId.getBytes(), columnFamily.getBytes(), deterTimes.get(4).getBytes());
Range range = new Range(startKey, endKey);
if (range.isEndKeyInclusive()) System.out.println("true");
scan.setRange(range);

for (Entry<Key,Value> entry : scan) {
Text row = entry.getKey().getRow();
Text cq = entry.getKey().getColumnQualifier();
Value value = entry.getValue();
System.out.println("Fetched row " + row + " with value: " + value + ", cq=" + cq);
}

输出:

true
Fetched row 3015551212<ll> with value: DETER1, cq='20181112:21:46:331'
Fetched row 3015551212<ll> with value: DETER2, cq='20181112:21:46:332'
Fetched row 3015551212<ll> with value: DETER3, cq='20181112:21:46:333'

最佳答案

您正在使用(行、列族、列限定符) 作为字节数组以及该键的其余维度(列可见性、时间戳) 构建结束键设置为默认值(具体来说,分别是空字节数组和 Long.MAX_VALUE)。

扫描仪将停在该确切的键处(包括该键)。但是,您的实际数据输入几乎肯定不是那个准确 key (您没有提供 makeRecord 的实现来验证)。即使您的数据实际上具有空列可见性,时间戳几乎肯定不是 Long.MAX_VALUE,而是您在 makeRecord 实现中设置的内容,或者是基于tserver 的时间或某个表逻辑计数器。由于 key 的时间戳维度按降序排列,因此您的扫描器将在到达您的条目之前停止在 Long.MAX_LONG 处查找数据。

这有点像在字典中搜索analogy,但是当您到达analog时停止:您将错过以analog<开头的其余单词.

这是基于精确键构建范围时的常见陷阱。通常,基于行构建范围(包含行将包含整行)而不是键(有一个 Range constructor for that )会更好。或者,指定结束键以使其独占运行。您可以通过将空字节附加到列的最后一个有意义的元素的末尾来完成此操作。例如,您可以执行以下操作:

Key endKey = new Key(rowId.getBytes(),
columnFamily.getBytes(),
(deterTimes.get(4) + "\0").getBytes());
Range range = new Range(startKey, true, endKey, false);

您应该注意的另一个陷阱是使用 String.getBytes() 来获取字节数组,而不指定编码。最好使用一致的东西,例如 "abc".getBytes(StandardCharsets.UTF_8) (不过,我通常会进行静态导入,因此我只能指定 UTF_8 )。

关于java - Accumulo 范围 - 不包含结束键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53272215/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com