Tablestore SDK untuk Java menyediakan iterator untuk membaca beberapa baris dalam rentang kunci primer. Iterator ini secara otomatis mengirim permintaan terpaginasi, sehingga cocok untuk memindai rentang besar dan memproses baris satu per satu.
Prasyarat
Instal Tablestore SDK untuk Java dan inisialisasi klien.
Deskripsi
public Iterator<Row> createRangeIterator(RangeIteratorParameter rangeIteratorParameter) throws TableStoreException, ClientException
Iterator dibuat pada rentang kunci primer dan mengembalikan Iterator<Row> standar Java. Setiap pemanggilan iterator.next() mengambil satu baris dari buffer internal dan mengirim permintaan batch berikutnya saat buffer kosong. Anda tidak perlu melacak nextStartPrimaryKey atau melakukan loop manual atas getRange.
Contoh berikut melakukan iterasi maju melalui tabel range_iter_demo, dimulai dari kunci primer row1 hingga akhir tabel, serta mencetak setiap baris.
String tableName = "range_iter_demo";
RangeIteratorParameter parameter = new RangeIteratorParameter(tableName);
// Kunci primer awal (inklusif)
PrimaryKeyBuilder startPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
parameter.setInclusiveStartPrimaryKey(startPkBuilder.build());
// Kunci primer akhir (eksklusif). INF_MAX membaca hingga akhir tabel.
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 baris yang diiterasi: " + count);
Parameter
Gunakan RangeIteratorParameter untuk menentukan kondisi kueri iterasi. Parameter tersebut dijelaskan di bawah ini.
|
Nama |
Tipe |
Deskripsi |
|
tableName (wajib) |
String |
Nama tabel yang akan dibaca. |
|
inclusiveStartPrimaryKey (wajib) |
PrimaryKey |
Kunci primer awal, termasuk nama dan nilai kolom kunci primernya.
|
|
exclusiveEndPrimaryKey (wajib) |
PrimaryKey |
Kunci primer akhir, termasuk nama dan nilai kolom kunci primernya.
|
|
direction (opsional) |
Direction |
Arah pembacaan.
|
|
maxVersions (wajib, salah satu dari maxVersions atau timeRange) |
OptionalValue<Integer> |
Jumlah maksimum versi yang dikembalikan per kolom atribut. Anda harus menetapkan minimal salah satu dari Jika jumlah versi yang sesuai melebihi batas maksimum ini, Tablestore mengembalikan versi terbaru dalam urutan dari terbaru ke terlama, hingga mencapai jumlah maksimum tersebut. |
|
timeRange (wajib, salah satu dari maxVersions atau timeRange) |
OptionalValue<TimeRange> |
Rentang versi. Anda harus menetapkan minimal salah satu dari Setiap kolom atribut dapat menyimpan beberapa versi. Menetapkan rentang versi hanya mengembalikan data dalam rentang tersebut. |
|
maxCount (opsional) |
int |
Jumlah maksimum total baris yang dikembalikan oleh iterator. Harus lebih besar dari 0. |
|
bufferSize (opsional) |
int |
Jumlah baris yang diambil per permintaan dasar. Harus lebih besar dari 0. Kurangi nilai ini untuk mengurangi penggunaan memori puncak selama pemindaian besar. Saat batch saat ini habis, iterator secara otomatis meminta batch berikutnya mulai dari posisi terakhir. |
|
columnsToGet (opsional) |
Set<String> |
Kolom yang akan dibaca. Dapat berupa kolom kunci primer atau kolom atribut.
|
|
filter (opsional) |
OptionalValue<Filter> |
Kondisi filter. Untuk informasi selengkapnya, lihat Gunakan filter. Jika Anda menetapkan |
Contoh
Iterasi mundur
Gunakan setDirection(Direction.BACKWARD) untuk melakukan iterasi mundur. Pada iterasi mundur, kunci primer awal harus lebih besar daripada kunci primer akhir.
String tableName = "range_iter_demo";
RangeIteratorParameter parameter = new RangeIteratorParameter(tableName);
parameter.setDirection(Direction.BACKWARD);
// Untuk iterasi mundur, kunci primer awal harus lebih besar daripada kunci primer akhir.
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);
}
Batasi jumlah total baris
Gunakan setMaxCount untuk membatasi jumlah total baris yang dikembalikan oleh iterator. Fitur ini berguna untuk pembacaan top-N dan mencegah pemindaian yang tidak perlu.
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);
// Mengembalikan maksimal 3 baris.
parameter.setMaxCount(3);
Iterator<Row> iterator = client.createRangeIterator(parameter);
while (iterator.hasNext()) {
Row row = iterator.next();
System.out.println(row);
}
Optimalkan memori dengan ukuran batch
Gunakan setBufferSize untuk mengontrol jumlah baris yang diambil dalam setiap permintaan dasar. Kurangi nilainya untuk menekan penggunaan memori puncak selama pemindaian besar.
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);
// Ambil 2 baris per permintaan dasar.
parameter.setBufferSize(2);
Iterator<Row> iterator = client.createRangeIterator(parameter);
while (iterator.hasNext()) {
Row row = iterator.next();
System.out.println(row);
}