Tablestore SDK for Java provides an iterator that reads multiple rows within a primary key range. The iterator issues paginated requests automatically, which is useful for large-range scans that process rows one at a time.
Prerequisites
Install the Tablestore SDK for Java and initialize the client.
Description
public Iterator<Row> createRangeIterator(RangeIteratorParameter rangeIteratorParameter) throws TableStoreException, ClientException
Creates an iterator over a primary key range and returns a standard Java Iterator<Row>. Each call to iterator.next() returns a row from an internal buffer and issues the next batch request when the buffer is empty. You do not need to track nextStartPrimaryKey or loop over getRange manually.
The following example iterates forward through the range_iter_demo table, starting at primary key row1 and continuing to the end of the table, printing each row.
String tableName = "range_iter_demo";
RangeIteratorParameter parameter = new RangeIteratorParameter(tableName);
// Start primary key (inclusive)
PrimaryKeyBuilder startPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
parameter.setInclusiveStartPrimaryKey(startPkBuilder.build());
// End primary key (exclusive). INF_MAX reads to the end of the table.
PrimaryKeyBuilder endPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
parameter.setExclusiveEndPrimaryKey(endPkBuilder.build());
parameter.setMaxVersions(1);
Iterator<Row> iterator = client.createRangeIterator(parameter);
int count = 0;
while (iterator.hasNext()) {
Row row = iterator.next();
System.out.println(row);
count++;
}
System.out.println("Total rows iterated: " + count);
Parameters
Use RangeIteratorParameter to carry the iteration query conditions. The parameters are described below.
|
Name |
Type |
Description |
|
tableName (required) |
String |
The name of the table to read. |
|
inclusiveStartPrimaryKey (required) |
PrimaryKey |
The start primary key, including primary key column names and values.
|
|
exclusiveEndPrimaryKey (required) |
PrimaryKey |
The end primary key, including primary key column names and values.
|
|
direction (optional) |
Direction |
The read direction.
|
|
maxVersions (required, one of maxVersions or timeRange) |
OptionalValue<Integer> |
The maximum number of versions returned per attribute column. You must set at least one of If matching versions exceed this maximum, Tablestore returns the most recent versions in newest-to-oldest order, up to the maximum. |
|
timeRange (required, one of maxVersions or timeRange) |
OptionalValue<TimeRange> |
The version range. You must set at least one of Each attribute column can hold multiple versions. Setting a version range returns only the data within that range. |
|
maxCount (optional) |
int |
The maximum total number of rows the iterator returns. Must be greater than 0. |
|
bufferSize (optional) |
int |
The number of rows fetched per underlying request. Must be greater than 0. Lower this value to reduce peak memory usage during large scans. When the current batch is exhausted, the iterator automatically requests the next batch starting from where it left off. |
|
columnsToGet (optional) |
Set<String> |
The columns to read. Can be primary key columns or attribute columns.
|
|
filter (optional) |
OptionalValue<Filter> |
The filter condition. For more information, see Use filters. If you set both |
Examples
Backward iteration
Use setDirection(Direction.BACKWARD) to iterate backward. For backward iteration, the start primary key must be greater than the end primary key.
String tableName = "range_iter_demo";
RangeIteratorParameter parameter = new RangeIteratorParameter(tableName);
parameter.setDirection(Direction.BACKWARD);
// For backward iteration, the start primary key must be greater than the end primary key.
PrimaryKeyBuilder startPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
parameter.setInclusiveStartPrimaryKey(startPkBuilder.build());
PrimaryKeyBuilder endPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
parameter.setExclusiveEndPrimaryKey(endPkBuilder.build());
parameter.setMaxVersions(1);
Iterator<Row> iterator = client.createRangeIterator(parameter);
while (iterator.hasNext()) {
Row row = iterator.next();
System.out.println(row);
}
Limit the total number of rows
Use setMaxCount to cap the total number of rows the iterator returns. This is useful for top-N reads and avoids unnecessary scans.
String tableName = "range_iter_demo";
RangeIteratorParameter parameter = new RangeIteratorParameter(tableName);
PrimaryKeyBuilder startPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MIN);
parameter.setInclusiveStartPrimaryKey(startPkBuilder.build());
PrimaryKeyBuilder endPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
parameter.setExclusiveEndPrimaryKey(endPkBuilder.build());
parameter.setMaxVersions(1);
// Return at most 3 rows.
parameter.setMaxCount(3);
Iterator<Row> iterator = client.createRangeIterator(parameter);
while (iterator.hasNext()) {
Row row = iterator.next();
System.out.println(row);
}
Optimize memory with batch size
Use setBufferSize to control the number of rows fetched per underlying request. Lower the value to reduce peak memory usage during large scans.
String tableName = "range_iter_demo";
RangeIteratorParameter parameter = new RangeIteratorParameter(tableName);
PrimaryKeyBuilder startPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MIN);
parameter.setInclusiveStartPrimaryKey(startPkBuilder.build());
PrimaryKeyBuilder endPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
parameter.setExclusiveEndPrimaryKey(endPkBuilder.build());
parameter.setMaxVersions(1);
// Fetch 2 rows per underlying request.
parameter.setBufferSize(2);
Iterator<Row> iterator = client.createRangeIterator(parameter);
while (iterator.hasNext()) {
Row row = iterator.next();
System.out.println(row);
}