Tablestore SDK for Java memungkinkan pembacaan baris dalam rentang kunci primer menggunakan iterator dan secara otomatis mengambil batch berikutnya.
Prasyarat
Instal Tablestore SDK for Java dan inisialisasi klien.
Deskripsi
Panggil metode createRangeIterator untuk membuat iterator baris pada rentang kunci primer tertentu. Saat batch saat ini habis, iterator secara otomatis mengirim permintaan berikutnya, sehingga Anda tidak perlu melacak nextStartPrimaryKey atau melakukan loop terhadap getRange.
public Iterator<Row> createRangeIterator(RangeIteratorParameter rangeIteratorParameter) throws TableStoreException, ClientException
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 primer.
|
|
exclusiveEndPrimaryKey (wajib) |
PrimaryKey |
Kunci primer akhir, termasuk nama dan nilai kolom kunci primer.
|
|
direction (opsional) |
Direction |
Arah pembacaan.
|
|
maxVersions (opsional) |
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 (opsional) |
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 Use filters. Jika Anda menetapkan |
Respons
createRangeIterator mengembalikan Iterator<Row>. Panggil hasNext() untuk memeriksa apakah masih ada data yang tersedia, dan next() untuk mendapatkan objek Row berikutnya.
Contoh
Iterasi mundur
Gunakan setDirection(Direction.BACKWARD) untuk melakukan iterasi mundur. Untuk 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 menghindari 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 per permintaan dasar. Kurangi nilainya untuk mengurangi 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);
}