Aerospike client has scanAll method for reading all rows from it's store. I use it in the folowing code:
ScanPolicy policy = new ScanPolicy();
policy.concurrentNodes = true;
policy.priority = Priority.DEFAULT;
policy.includeBinData = true;
policy.scanPercent = 100;
client.scanAll(policy, "namespaceName", "setName", new ScanCallback() {
@Override
public void scanCallback(Key key, Record record) throws AerospikeException {
STORE.put(key.userKey.toLong(), record.getValue("binName").toString());
}
});
But it is finished with NullPointerException
, because userKey is null. All other fields are valid as expected. User key is the Long value, that was used for saving data:
client.put(writePolicy, new Key("namespaceName", "setName", userKey), new Bin("binName", value));
All is fine, if I do single request like this:
client.get(readPolicy, new Key("namespaceName", "setName", userKey));
What may be wrong? Why userKey is null?
I opened a feature request internally, TOOLS-551 and TOOLS-539. Keep an eye out for a mention of it in the release notes. option. When you create records via AQL after setting KEY_SEND true, (default is false), the primary key is stored as a BIN and then you can retrieve it via the record.
To get all records belonging to a set, you can use scan API and pass the required set. To get all records with a specific bin value, you can use secondary index. Please Refer to the doc for details.
A record key is a set of record fields that is used to ensure the uniqueness of register records. A register cannot contain two records with identical values in all key fields. Record keys are also used for record identification (for example, if you need to find a specific list item).
A key uniquely identifies a record in the Aerospike database within a given namespace.
Aerospike uses key and set name to generate unique digest, So it stores only digest.
While inserting one record if you set writePolicy.sendKey = true
then key will be stored as metadata of record.
If one record is inserted with writePolicy.sendKey = true
then only you will get key in scanCallback().
By default writePolicy.sendKey is false, so by default scanCallback()
gets null as key. Thats why your key.userKey.toLong()
gives NullPointerException.
I too have faced this problem even at the time of writing we were setting the WritePolicy.sendkeys=true.
After 2-3 days debugging found that there were some issue with aerospike client version. Initially i were using 3.0.25 but after upgrading it to 3.0.35 it started working fine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With