Accumulo Range - End Key Not Inclusive
I am learning Accumulo and cannot seem to get the end key specified in a Range to be inclusive. My code is below. I have tried explicitly setting the endKeyInclusive to true in Range, but that didn't help.
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);
}
Output:
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'
java accumulo
add a comment |
I am learning Accumulo and cannot seem to get the end key specified in a Range to be inclusive. My code is below. I have tried explicitly setting the endKeyInclusive to true in Range, but that didn't help.
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);
}
Output:
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'
java accumulo
add a comment |
I am learning Accumulo and cannot seem to get the end key specified in a Range to be inclusive. My code is below. I have tried explicitly setting the endKeyInclusive to true in Range, but that didn't help.
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);
}
Output:
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'
java accumulo
I am learning Accumulo and cannot seem to get the end key specified in a Range to be inclusive. My code is below. I have tried explicitly setting the endKeyInclusive to true in Range, but that didn't help.
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);
}
Output:
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'
java accumulo
java accumulo
edited Nov 15 at 23:30
pushkin
3,929112651
3,929112651
asked Nov 13 at 0:51
codemasterg
85
85
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
You are constructing your end key with ( row, column family, column qualifier ) as byte arrays, and the remaining dimensions of the key ( column visibility, timestamp ) set to default values (specifically, an empty byte array and Long.MAX_VALUE, respectively).
The scanner will stop at that exact key, inclusively. However, your actual data entry is almost certainly not that exact key (you didn't provide your implementation of makeRecord to verify). Even if your data actually has an empty column visibility, the timestamp is almost certainly not Long.MAX_VALUE, but rather something you set in your makeRecord implementation or it was set based on the tserver's time or some table logical counter. Since the timestamp dimension of the key is ordered descending, your scanner will stop looking for data at Long.MAX_LONG before it reaches your entries.
This is a bit like searching a dictionary for analogy, but stopping when you reach analog: you'll miss the remaining words that begin with analog.
This is a common pitfall when constructing ranges based on exact keys. It is generally better to construct ranges based on rows (inclusive on rows will include the entire row), rather than keys (there is a Range constructor for that). Or, to specify the end key so that it works exclusively. You can do this by appending a null byte to the end of your last meaningful element of the column. For example, you can do something like:
Key endKey = new Key(rowId.getBytes(),
columnFamily.getBytes(),
(deterTimes.get(4) + "").getBytes());
Range range = new Range(startKey, true, endKey, false);
Another pitfall you should be careful of is using String.getBytes() to get your byte arrays, without specifying an encoding. It would be better to use something consistent, like "abc".getBytes(StandardCharsets.UTF_8) (I usually do a static import, though, so I can specify only UTF_8).
Thank you very much for taking the time to fully explain this, I incorrectly assumed that if I did not give specific timestamps for the Keys in a Range, that the query would not use the time portion of the stored Keys when looking for matches. While I understand the explanation, the need to append the null byte is awkward from an API perspective. I am querying with key range because I don't want all columns to be returned and there is no meaningful column family that can group columns for the data to be processed.
– codemasterg
Nov 17 at 13:48
I agree it is awkward. Internally, we use an API called nextKey or followingKey (don't remember exactly) for such situations, but I'm on my phone now and unable to check whether that is exposed in the public API.
– Christopher
Nov 19 at 22:13
add a comment |
The Range is running inclusively here but perhaps there's an issue with the values your adding to it
This would be easier to diagnose with the output but is there a chance you're expecting a deter time one higher because the array begins at zero so you see a deterTime one less than expected?
If this is not the case please share your output
Added output. Thanks. I should also add that I am using MiniAccumuloCluster, but I am assuming that shouldn't matter as far as Range is concerned.
– codemasterg
Nov 14 at 1:33
It looks like the endKey you specified was returned, the 4th entry in the array has a value of DETER3 which has been retrieved
– A. Timms
Nov 14 at 2:45
Since the range is 1 - 4 inclusive, I would have expected 4 items returned; i.e.: DETER1, DETER2, DETER3, DETER4. The 4th entry is the array is DETER4, the 0th item in the array is DETER0.
– codemasterg
Nov 14 at 11:46
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53272215%2faccumulo-range-end-key-not-inclusive%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
You are constructing your end key with ( row, column family, column qualifier ) as byte arrays, and the remaining dimensions of the key ( column visibility, timestamp ) set to default values (specifically, an empty byte array and Long.MAX_VALUE, respectively).
The scanner will stop at that exact key, inclusively. However, your actual data entry is almost certainly not that exact key (you didn't provide your implementation of makeRecord to verify). Even if your data actually has an empty column visibility, the timestamp is almost certainly not Long.MAX_VALUE, but rather something you set in your makeRecord implementation or it was set based on the tserver's time or some table logical counter. Since the timestamp dimension of the key is ordered descending, your scanner will stop looking for data at Long.MAX_LONG before it reaches your entries.
This is a bit like searching a dictionary for analogy, but stopping when you reach analog: you'll miss the remaining words that begin with analog.
This is a common pitfall when constructing ranges based on exact keys. It is generally better to construct ranges based on rows (inclusive on rows will include the entire row), rather than keys (there is a Range constructor for that). Or, to specify the end key so that it works exclusively. You can do this by appending a null byte to the end of your last meaningful element of the column. For example, you can do something like:
Key endKey = new Key(rowId.getBytes(),
columnFamily.getBytes(),
(deterTimes.get(4) + "").getBytes());
Range range = new Range(startKey, true, endKey, false);
Another pitfall you should be careful of is using String.getBytes() to get your byte arrays, without specifying an encoding. It would be better to use something consistent, like "abc".getBytes(StandardCharsets.UTF_8) (I usually do a static import, though, so I can specify only UTF_8).
Thank you very much for taking the time to fully explain this, I incorrectly assumed that if I did not give specific timestamps for the Keys in a Range, that the query would not use the time portion of the stored Keys when looking for matches. While I understand the explanation, the need to append the null byte is awkward from an API perspective. I am querying with key range because I don't want all columns to be returned and there is no meaningful column family that can group columns for the data to be processed.
– codemasterg
Nov 17 at 13:48
I agree it is awkward. Internally, we use an API called nextKey or followingKey (don't remember exactly) for such situations, but I'm on my phone now and unable to check whether that is exposed in the public API.
– Christopher
Nov 19 at 22:13
add a comment |
You are constructing your end key with ( row, column family, column qualifier ) as byte arrays, and the remaining dimensions of the key ( column visibility, timestamp ) set to default values (specifically, an empty byte array and Long.MAX_VALUE, respectively).
The scanner will stop at that exact key, inclusively. However, your actual data entry is almost certainly not that exact key (you didn't provide your implementation of makeRecord to verify). Even if your data actually has an empty column visibility, the timestamp is almost certainly not Long.MAX_VALUE, but rather something you set in your makeRecord implementation or it was set based on the tserver's time or some table logical counter. Since the timestamp dimension of the key is ordered descending, your scanner will stop looking for data at Long.MAX_LONG before it reaches your entries.
This is a bit like searching a dictionary for analogy, but stopping when you reach analog: you'll miss the remaining words that begin with analog.
This is a common pitfall when constructing ranges based on exact keys. It is generally better to construct ranges based on rows (inclusive on rows will include the entire row), rather than keys (there is a Range constructor for that). Or, to specify the end key so that it works exclusively. You can do this by appending a null byte to the end of your last meaningful element of the column. For example, you can do something like:
Key endKey = new Key(rowId.getBytes(),
columnFamily.getBytes(),
(deterTimes.get(4) + "").getBytes());
Range range = new Range(startKey, true, endKey, false);
Another pitfall you should be careful of is using String.getBytes() to get your byte arrays, without specifying an encoding. It would be better to use something consistent, like "abc".getBytes(StandardCharsets.UTF_8) (I usually do a static import, though, so I can specify only UTF_8).
Thank you very much for taking the time to fully explain this, I incorrectly assumed that if I did not give specific timestamps for the Keys in a Range, that the query would not use the time portion of the stored Keys when looking for matches. While I understand the explanation, the need to append the null byte is awkward from an API perspective. I am querying with key range because I don't want all columns to be returned and there is no meaningful column family that can group columns for the data to be processed.
– codemasterg
Nov 17 at 13:48
I agree it is awkward. Internally, we use an API called nextKey or followingKey (don't remember exactly) for such situations, but I'm on my phone now and unable to check whether that is exposed in the public API.
– Christopher
Nov 19 at 22:13
add a comment |
You are constructing your end key with ( row, column family, column qualifier ) as byte arrays, and the remaining dimensions of the key ( column visibility, timestamp ) set to default values (specifically, an empty byte array and Long.MAX_VALUE, respectively).
The scanner will stop at that exact key, inclusively. However, your actual data entry is almost certainly not that exact key (you didn't provide your implementation of makeRecord to verify). Even if your data actually has an empty column visibility, the timestamp is almost certainly not Long.MAX_VALUE, but rather something you set in your makeRecord implementation or it was set based on the tserver's time or some table logical counter. Since the timestamp dimension of the key is ordered descending, your scanner will stop looking for data at Long.MAX_LONG before it reaches your entries.
This is a bit like searching a dictionary for analogy, but stopping when you reach analog: you'll miss the remaining words that begin with analog.
This is a common pitfall when constructing ranges based on exact keys. It is generally better to construct ranges based on rows (inclusive on rows will include the entire row), rather than keys (there is a Range constructor for that). Or, to specify the end key so that it works exclusively. You can do this by appending a null byte to the end of your last meaningful element of the column. For example, you can do something like:
Key endKey = new Key(rowId.getBytes(),
columnFamily.getBytes(),
(deterTimes.get(4) + "").getBytes());
Range range = new Range(startKey, true, endKey, false);
Another pitfall you should be careful of is using String.getBytes() to get your byte arrays, without specifying an encoding. It would be better to use something consistent, like "abc".getBytes(StandardCharsets.UTF_8) (I usually do a static import, though, so I can specify only UTF_8).
You are constructing your end key with ( row, column family, column qualifier ) as byte arrays, and the remaining dimensions of the key ( column visibility, timestamp ) set to default values (specifically, an empty byte array and Long.MAX_VALUE, respectively).
The scanner will stop at that exact key, inclusively. However, your actual data entry is almost certainly not that exact key (you didn't provide your implementation of makeRecord to verify). Even if your data actually has an empty column visibility, the timestamp is almost certainly not Long.MAX_VALUE, but rather something you set in your makeRecord implementation or it was set based on the tserver's time or some table logical counter. Since the timestamp dimension of the key is ordered descending, your scanner will stop looking for data at Long.MAX_LONG before it reaches your entries.
This is a bit like searching a dictionary for analogy, but stopping when you reach analog: you'll miss the remaining words that begin with analog.
This is a common pitfall when constructing ranges based on exact keys. It is generally better to construct ranges based on rows (inclusive on rows will include the entire row), rather than keys (there is a Range constructor for that). Or, to specify the end key so that it works exclusively. You can do this by appending a null byte to the end of your last meaningful element of the column. For example, you can do something like:
Key endKey = new Key(rowId.getBytes(),
columnFamily.getBytes(),
(deterTimes.get(4) + "").getBytes());
Range range = new Range(startKey, true, endKey, false);
Another pitfall you should be careful of is using String.getBytes() to get your byte arrays, without specifying an encoding. It would be better to use something consistent, like "abc".getBytes(StandardCharsets.UTF_8) (I usually do a static import, though, so I can specify only UTF_8).
edited Nov 15 at 23:26
answered Nov 15 at 23:21
Christopher
1,9391420
1,9391420
Thank you very much for taking the time to fully explain this, I incorrectly assumed that if I did not give specific timestamps for the Keys in a Range, that the query would not use the time portion of the stored Keys when looking for matches. While I understand the explanation, the need to append the null byte is awkward from an API perspective. I am querying with key range because I don't want all columns to be returned and there is no meaningful column family that can group columns for the data to be processed.
– codemasterg
Nov 17 at 13:48
I agree it is awkward. Internally, we use an API called nextKey or followingKey (don't remember exactly) for such situations, but I'm on my phone now and unable to check whether that is exposed in the public API.
– Christopher
Nov 19 at 22:13
add a comment |
Thank you very much for taking the time to fully explain this, I incorrectly assumed that if I did not give specific timestamps for the Keys in a Range, that the query would not use the time portion of the stored Keys when looking for matches. While I understand the explanation, the need to append the null byte is awkward from an API perspective. I am querying with key range because I don't want all columns to be returned and there is no meaningful column family that can group columns for the data to be processed.
– codemasterg
Nov 17 at 13:48
I agree it is awkward. Internally, we use an API called nextKey or followingKey (don't remember exactly) for such situations, but I'm on my phone now and unable to check whether that is exposed in the public API.
– Christopher
Nov 19 at 22:13
Thank you very much for taking the time to fully explain this, I incorrectly assumed that if I did not give specific timestamps for the Keys in a Range, that the query would not use the time portion of the stored Keys when looking for matches. While I understand the explanation, the need to append the null byte is awkward from an API perspective. I am querying with key range because I don't want all columns to be returned and there is no meaningful column family that can group columns for the data to be processed.
– codemasterg
Nov 17 at 13:48
Thank you very much for taking the time to fully explain this, I incorrectly assumed that if I did not give specific timestamps for the Keys in a Range, that the query would not use the time portion of the stored Keys when looking for matches. While I understand the explanation, the need to append the null byte is awkward from an API perspective. I am querying with key range because I don't want all columns to be returned and there is no meaningful column family that can group columns for the data to be processed.
– codemasterg
Nov 17 at 13:48
I agree it is awkward. Internally, we use an API called nextKey or followingKey (don't remember exactly) for such situations, but I'm on my phone now and unable to check whether that is exposed in the public API.
– Christopher
Nov 19 at 22:13
I agree it is awkward. Internally, we use an API called nextKey or followingKey (don't remember exactly) for such situations, but I'm on my phone now and unable to check whether that is exposed in the public API.
– Christopher
Nov 19 at 22:13
add a comment |
The Range is running inclusively here but perhaps there's an issue with the values your adding to it
This would be easier to diagnose with the output but is there a chance you're expecting a deter time one higher because the array begins at zero so you see a deterTime one less than expected?
If this is not the case please share your output
Added output. Thanks. I should also add that I am using MiniAccumuloCluster, but I am assuming that shouldn't matter as far as Range is concerned.
– codemasterg
Nov 14 at 1:33
It looks like the endKey you specified was returned, the 4th entry in the array has a value of DETER3 which has been retrieved
– A. Timms
Nov 14 at 2:45
Since the range is 1 - 4 inclusive, I would have expected 4 items returned; i.e.: DETER1, DETER2, DETER3, DETER4. The 4th entry is the array is DETER4, the 0th item in the array is DETER0.
– codemasterg
Nov 14 at 11:46
add a comment |
The Range is running inclusively here but perhaps there's an issue with the values your adding to it
This would be easier to diagnose with the output but is there a chance you're expecting a deter time one higher because the array begins at zero so you see a deterTime one less than expected?
If this is not the case please share your output
Added output. Thanks. I should also add that I am using MiniAccumuloCluster, but I am assuming that shouldn't matter as far as Range is concerned.
– codemasterg
Nov 14 at 1:33
It looks like the endKey you specified was returned, the 4th entry in the array has a value of DETER3 which has been retrieved
– A. Timms
Nov 14 at 2:45
Since the range is 1 - 4 inclusive, I would have expected 4 items returned; i.e.: DETER1, DETER2, DETER3, DETER4. The 4th entry is the array is DETER4, the 0th item in the array is DETER0.
– codemasterg
Nov 14 at 11:46
add a comment |
The Range is running inclusively here but perhaps there's an issue with the values your adding to it
This would be easier to diagnose with the output but is there a chance you're expecting a deter time one higher because the array begins at zero so you see a deterTime one less than expected?
If this is not the case please share your output
The Range is running inclusively here but perhaps there's an issue with the values your adding to it
This would be easier to diagnose with the output but is there a chance you're expecting a deter time one higher because the array begins at zero so you see a deterTime one less than expected?
If this is not the case please share your output
answered Nov 13 at 1:50
A. Timms
764
764
Added output. Thanks. I should also add that I am using MiniAccumuloCluster, but I am assuming that shouldn't matter as far as Range is concerned.
– codemasterg
Nov 14 at 1:33
It looks like the endKey you specified was returned, the 4th entry in the array has a value of DETER3 which has been retrieved
– A. Timms
Nov 14 at 2:45
Since the range is 1 - 4 inclusive, I would have expected 4 items returned; i.e.: DETER1, DETER2, DETER3, DETER4. The 4th entry is the array is DETER4, the 0th item in the array is DETER0.
– codemasterg
Nov 14 at 11:46
add a comment |
Added output. Thanks. I should also add that I am using MiniAccumuloCluster, but I am assuming that shouldn't matter as far as Range is concerned.
– codemasterg
Nov 14 at 1:33
It looks like the endKey you specified was returned, the 4th entry in the array has a value of DETER3 which has been retrieved
– A. Timms
Nov 14 at 2:45
Since the range is 1 - 4 inclusive, I would have expected 4 items returned; i.e.: DETER1, DETER2, DETER3, DETER4. The 4th entry is the array is DETER4, the 0th item in the array is DETER0.
– codemasterg
Nov 14 at 11:46
Added output. Thanks. I should also add that I am using MiniAccumuloCluster, but I am assuming that shouldn't matter as far as Range is concerned.
– codemasterg
Nov 14 at 1:33
Added output. Thanks. I should also add that I am using MiniAccumuloCluster, but I am assuming that shouldn't matter as far as Range is concerned.
– codemasterg
Nov 14 at 1:33
It looks like the endKey you specified was returned, the 4th entry in the array has a value of DETER3 which has been retrieved
– A. Timms
Nov 14 at 2:45
It looks like the endKey you specified was returned, the 4th entry in the array has a value of DETER3 which has been retrieved
– A. Timms
Nov 14 at 2:45
Since the range is 1 - 4 inclusive, I would have expected 4 items returned; i.e.: DETER1, DETER2, DETER3, DETER4. The 4th entry is the array is DETER4, the 0th item in the array is DETER0.
– codemasterg
Nov 14 at 11:46
Since the range is 1 - 4 inclusive, I would have expected 4 items returned; i.e.: DETER1, DETER2, DETER3, DETER4. The 4th entry is the array is DETER4, the 0th item in the array is DETER0.
– codemasterg
Nov 14 at 11:46
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53272215%2faccumulo-range-end-key-not-inclusive%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown