Tablestore menyediakan berbagai operasi untuk membaca data dari tabel. Anda dapat membaca satu baris data, beberapa baris sekaligus, data dengan nilai primary key dalam rentang tertentu, menggunakan iterator, atau membaca data secara konkuren.
Metode kueri
Tablestore menyediakan operasi GetRow, BatchGetRow, dan GetRange yang dapat Anda panggil untuk membaca data. Sebelum Anda membaca data, pilih metode kueri yang sesuai berdasarkan skenario kueri aktual Anda.
Jika Anda ingin membaca data dari tabel yang memiliki kolom primary key auto-increment, pastikan semua nilai kolom primary key termasuk kolom auto-increment telah diperoleh. Untuk detail lebih lanjut, lihat Kolom Primary Key Auto-Increment. Jika tidak ada nilai tercatat untuk kolom primary key auto-increment, gunakan operasi GetRange untuk menentukan rentang primary key berdasarkan nilai kolom primary key pertama.
Metode | Deskripsi | Skenario |
Gunakan operasi GetRow untuk membaca satu baris data. | Cocok untuk skenario di mana nilai semua kolom primary key dari baris yang ingin dibaca dapat ditentukan dan jumlah baris sedikit. | |
Gunakan operasi BatchGetRow untuk membaca beberapa baris data dari satu atau lebih tabel secara bersamaan. Operasi BatchGetRow terdiri dari beberapa operasi GetRow. Proses pembuatan setiap operasi GetRow sama seperti saat memanggil operasi GetRow secara langsung. | Cocok untuk skenario di mana nilai semua kolom primary key dari baris yang ingin dibaca dapat ditentukan dan jumlah baris besar atau jika Anda ingin membaca data dari beberapa tabel. | |
Membaca Data dengan Nilai Primary Key dalam Rentang Tertentu | Gunakan operasi GetRange untuk membaca data dengan nilai primary key dalam rentang tertentu. Operasi GetRange memungkinkan Anda membaca data dalam arah maju atau mundur. Anda juga dapat menentukan jumlah baris yang ingin dibaca. Jika rentang besar dan jumlah baris atau volume data melebihi batas atas, pemindaian akan berhenti, dan baris yang dibaca serta informasi tentang primary key baris berikutnya dikembalikan. Anda dapat melanjutkan dari posisi tersebut untuk membaca sisa data. | Cocok untuk skenario di mana rentang nilai primary key atau awalan nilai primary key dari baris yang ingin dibaca dapat ditentukan. Penting Jika Anda tidak dapat menentukan awalan nilai primary key, atur primary key awal ke INF_MIN dan akhir ke INF_MAX untuk memindai semua data dalam tabel. Ini mengonsumsi banyak sumber daya komputasi. Lakukan dengan hati-hati. |
Membaca Data dengan Nilai Primary Key dalam Rentang Tertentu Menggunakan Iterator | Gunakan operasi createRangeIterator untuk membaca data dengan nilai primary key dalam rentang tertentu menggunakan iterator. | Cocok untuk skenario di mana rentang nilai primary key atau awalan nilai primary key dari baris yang ingin dibaca dapat ditentukan dan iterator diperlukan untuk membaca data. |
Tablestore SDK for Java menyediakan kelas TableStoreReader yang mengenkapsulasi operasi BatchGetRow. Kelas ini mendukung kueri multi-tabel, statistik status kueri, callback tingkat baris, dan konfigurasi kustom. | Cocok untuk skenario di mana nilai semua kolom primary key dari baris yang ingin dibaca dapat ditentukan dan jumlah baris besar atau jika Anda ingin membaca data dari beberapa tabel. |
Persyaratan awal
Sebuah instance OTSClient telah diinisialisasi. Untuk detail lebih lanjut, lihat Inisialisasi Klien.
Tabel data telah dibuat, dan data telah ditulis ke tabel.
Membaca satu baris data
Gunakan operasi GetRow untuk membaca satu baris data. Setelah memanggil operasi GetRow, salah satu hasil berikut mungkin dikembalikan:
Jika baris tersebut ada, kolom primary key dan atribut dari baris tersebut dikembalikan.
Jika baris tersebut tidak ada, tidak ada baris yang dikembalikan dan tidak ada kesalahan yang dilaporkan.
Parameter
Parameter | Deskripsi |
tableName | Nama tabel data. |
primaryKey | Primary key dari baris. Nilai parameter ini terdiri dari nama, tipe, dan nilai setiap kolom primary key. Penting Jumlah dan tipe kolom primary key yang Anda tentukan harus sama dengan jumlah dan tipe kolom primary key aktual dalam tabel data. |
columnsToGet | Kolom yang ingin Anda kembalikan. Anda dapat menentukan nama kolom primary key atau kolom atribut.
Catatan
|
maxVersions | Jumlah maksimum versi data yang dapat dikembalikan. Penting Anda harus mengonfigurasi setidaknya salah satu parameter berikut: maxVersions dan timeRange.
|
timeRange | Rentang versi atau versi spesifik yang ingin Anda kembalikan. Untuk informasi lebih lanjut, lihat TimeRange. Penting Anda harus mengonfigurasi setidaknya salah satu parameter berikut: maxVersions dan timeRange.
Anda hanya perlu mengonfigurasi salah satu dari timestamp dan Nilai valid parameter timeRange: 0 hingga |
filter | Filter yang ingin Anda gunakan untuk menyaring hasil kueri di sisi server. Hanya baris yang memenuhi kondisi filter yang dikembalikan. Untuk informasi lebih lanjut, lihat Konfigurasi filter. Catatan Jika Anda mengonfigurasi parameter columnsToGet dan filter, Tablestore mengkueri kolom yang ditentukan oleh parameter columnsToGet, lalu mengembalikan baris yang memenuhi kondisi filter. |
Contoh
Anda dapat menentukan versi data dan kolom yang ingin dibaca, serta menyaring data menggunakan filter atau ekspresi reguler.
Membaca data versi terbaru dari kolom tertentu dalam baris
Kode sampel berikut menunjukkan cara membaca data versi terbaru dari kolom tertentu dalam baris di tabel data.
private static void getRow(SyncClient client, String pkValue) {
// Konstruksi primary key.
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// Tentukan nama tabel dan primary key untuk membaca satu baris data.
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
// Atur parameter MaxVersions ke 1 untuk membaca versi terbaru data.
criteria.setMaxVersions(1);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
System.out.println("Baca selesai. Hasil:");
System.out.println(row);
// Tentukan kolom yang ingin Anda baca.
criteria.addColumnsToGet("Col0");
getRowResponse = client.getRow(new GetRowRequest(criteria));
row = getRowResponse.getRow();
System.out.println("Baca selesai. Hasil:");
System.out.println(row);
} Gunakan filter untuk menyaring data yang dibaca
Kode sampel berikut menunjukkan cara membaca data versi terbaru dari baris dalam tabel data dan menggunakan filter untuk menyaring data berdasarkan nilai kolom Col0.
private static void getRow(SyncClient client, String pkValue) {
// Konstruksi primary key.
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// Tentukan nama tabel dan primary key untuk membaca satu baris data.
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
// Atur parameter MaxVersions ke 1 untuk membaca versi terbaru data.
criteria.setMaxVersions(1);
// Konfigurasikan filter untuk mengembalikan baris di mana nilai kolom Col0 adalah 0.
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
// Jika kolom Col0 tidak ada, baris tidak dikembalikan.
singleColumnValueFilter.setPassIfMissing(false);
criteria.setFilter(singleColumnValueFilter);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
System.out.println("Baca selesai. Hasil:");
System.out.println(row);
}Gunakan ekspresi reguler untuk menyaring data yang dibaca
Kode sampel berikut menunjukkan cara membaca data dari kolom Col1 dalam baris di tabel data dan menggunakan ekspresi reguler untuk menyaring data dalam kolom tersebut.
private static void getRow(SyncClient client, String pkValue) {
// Tentukan nama tabel data.
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>");
// Konstruksi primary key.
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue))
.build();
criteria.setPrimaryKey(primaryKey);
// Atur parameter MaxVersions ke 1 untuk membaca versi terbaru data.
criteria.setMaxVersions(1);
// Konfigurasikan filter. Baris dikembalikan ketika cast<int>(regex(Col1)) lebih besar dari 100.
RegexRule regexRule = new RegexRule("t1:([0-9]+),", RegexRule.CastType.VT_INTEGER);
SingleColumnValueRegexFilter filter = new SingleColumnValueRegexFilter("Col1",
regexRule,SingleColumnValueRegexFilter.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
criteria.setFilter(filter);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
System.out.println("Baca selesai. Hasil:");
System.out.println(row);
}Membaca beberapa baris data secara bersamaan
Gunakan operasi BatchGetRow untuk membaca beberapa baris data dari satu atau lebih tabel secara bersamaan. Operasi BatchGetRow terdiri dari beberapa operasi GetRow. Proses pembuatan setiap operasi GetRow sama seperti saat memanggil operasi GetRow secara langsung.
Jika Anda memanggil operasi BatchGetRow, setiap operasi GetRow dilakukan secara terpisah. Tablestore mengembalikan respons untuk setiap operasi GetRow secara terpisah.
Catatan penggunaan
Operasi BatchGetRow menggunakan konfigurasi parameter yang sama untuk semua baris. Misalnya, jika parameter
ColumnsToGetdiatur ke [colA], hanya nilai kolom colA yang dibaca dari semua baris.Jika beberapa baris gagal dibaca saat memanggil operasi BatchGetRow, Tablestore tidak mengembalikan pengecualian tetapi mengembalikan BatchGetRowResponse, yang mencakup pesan kesalahan untuk baris yang gagal. Periksa nilai pengembalian menggunakan metode isAllSucceed atau getFailedRows dari BatchGetRowResponse.
Anda dapat membaca hingga 100 baris secara bersamaan menggunakan operasi BatchGetRow.
Parameter
Untuk informasi lebih lanjut, lihat bagian Parameter untuk Membaca Satu Baris Data dari topik ini.
Contoh
Kode sampel berikut menunjukkan cara mengonfigurasi kondisi versi, kolom yang ingin dibaca, dan filter untuk membaca 10 baris data.
private static void batchGetRow(SyncClient client) {
// Tentukan nama tabel data.
MultiRowQueryCriteria multiRowQueryCriteria = new MultiRowQueryCriteria("<TABLE_NAME>");
// Tentukan 10 baris yang ingin Anda baca.
for (int i = 0; i < 10; i++) {
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk" + i));
PrimaryKey primaryKey = primaryKeyBuilder.build();
multiRowQueryCriteria.addRow(primaryKey);
}
// Tambahkan kondisi.
multiRowQueryCriteria.setMaxVersions(1);
multiRowQueryCriteria.addColumnsToGet("Col0");
multiRowQueryCriteria.addColumnsToGet("Col1");
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
singleColumnValueFilter.setPassIfMissing(false);
multiRowQueryCriteria.setFilter(singleColumnValueFilter);
BatchGetRowRequest batchGetRowRequest = new BatchGetRowRequest();
// Operasi BatchGetRow memungkinkan Anda membaca data dari beberapa tabel. Setiap parameter multiRowQueryCriteria menentukan kondisi kueri untuk satu tabel. Anda dapat menambahkan beberapa parameter multiRowQueryCriteria untuk membaca data dari beberapa tabel.
batchGetRowRequest.addMultiRowQueryCriteria(multiRowQueryCriteria);
BatchGetRowResponse batchGetRowResponse = client.batchGetRow(batchGetRowRequest);
System.out.println("Apakah semua operasi berhasil:" + batchGetRowResponse.isAllSucceed());
System.out.println("Baca selesai. Hasil:");
for (BatchGetRowResponse.RowResult rowResult : batchGetRowResponse.getSucceedRows()) {
System.out.println(rowResult.getRow());
}
if (!batchGetRowResponse.isAllSucceed()) {
for (BatchGetRowResponse.RowResult rowResult : batchGetRowResponse.getFailedRows()) {
System.out.println("Baris gagal:" + batchGetRowRequest.getPrimaryKey(rowResult.getTableName(), rowResult.getIndex()));
System.out.println("Penyebab kegagalan:" + rowResult.getError());
}
/**
* Anda dapat menggunakan metode createRequestForRetry untuk membuat permintaan lain untuk mencoba ulang operasi pada baris yang gagal. Dalam contoh ini, hanya permintaan ulang yang dibuat.
* Kami merekomendasikan Anda menggunakan kebijakan ulang kustom dalam Tablestore SDK sebagai metode ulang. Dengan cara ini, Anda dapat mencoba ulang baris yang gagal setelah operasi batch dilakukan. Setelah Anda menentukan kebijakan ulang, Anda tidak perlu menambahkan kode ulang untuk memanggil operasi.
*/
BatchGetRowRequest retryRequest = batchGetRowRequest.createRequestForRetry(batchGetRowResponse.getFailedRows());
}
}Membaca data yang nilai primary key-nya berada dalam rentang tertentu
Gunakan operasi GetRange untuk membaca data dengan nilai primary key dalam rentang tertentu.
Operasi GetRange memungkinkan Anda membaca data dalam arah maju atau mundur. Anda juga dapat menentukan jumlah baris yang ingin dibaca. Jika rentang besar dan jumlah baris atau volume data melebihi batas atas, pemindaian berhenti, dan baris yang dibaca serta informasi tentang primary key baris berikutnya dikembalikan. Anda dapat melanjutkan dari posisi tersebut untuk membaca sisa data.
Dalam tabel Tablestore, semua baris diurutkan berdasarkan primary key. Primary key tabel terdiri dari semua kolom primary key secara berurutan, sehingga baris tidak diurutkan berdasarkan kolom primary key tertentu.
Catatan Penggunaan
Operasi GetRange mengikuti prinsip pencocokan paling kiri. Tablestore membandingkan nilai secara berurutan dari kolom primary key pertama hingga terakhir untuk membaca data yang nilai primary key-nya berada dalam rentang tertentu. Sebagai contoh, primary key tabel data terdiri dari kolom primary key berikut: PK1, PK2, dan PK3. Saat membaca data, Tablestore pertama-tama memeriksa apakah nilai PK1 dari sebuah baris berada dalam rentang yang ditentukan untuk kolom primary key pertama. Jika nilai PK1 berada dalam rentang, Tablestore menghentikan pemeriksaan lebih lanjut dan langsung mengembalikan baris tersebut. Namun, jika nilai PK1 tidak berada dalam rentang, Tablestore melanjutkan dengan memeriksa nilai kolom primary key lainnya (PK2 dan PK3) menggunakan metode yang sama.
Operasi GetRange mungkin berhenti dan mengembalikan data jika salah satu dari kondisi berikut terpenuhi:
Jumlah data yang dipindai mencapai 4 MB.
Jumlah baris yang dipindai mencapai 5.000.
Jumlah baris yang dikembalikan mencapai batas atas.
Throughput baca tidak cukup untuk membaca baris data berikutnya karena semua throughput baca cadangan telah habis digunakan.
Setiap pemanggilan GetRange memindai data sekali. Jika ukuran data yang ingin dipindai melalui operasi GetRange besar, pemindaian akan berhenti ketika jumlah baris mencapai 5.000 atau ukuran data mencapai 4 MB. Tablestore tidak mengembalikan data tersisa yang memenuhi kondisi kueri. Anda dapat menggunakan metode paging untuk mendapatkan sisa data yang memenuhi kondisi tersebut.
Parameter
Parameter | Deskripsi |
tableName | Nama tabel data. |
direction | Urutan di mana Anda ingin mengurutkan baris dalam respons.
Sebagai contoh, sebuah tabel memiliki dua nilai primary key A dan B, dan Nilai A lebih kecil dari Nilai B. Jika Anda mengatur parameter direction ke FORWARD dan menentukan rentang |
inclusiveStartPrimaryKey | Primary key awal dan akhir dari rentang yang ingin Anda baca. Primary key awal dan akhir harus berupa primary key yang valid atau titik virtual yang berisi data tipe INF_MIN atau INF_MAX. Jumlah kolom untuk setiap titik virtual harus sama dengan jumlah kolom setiap primary key. INF_MIN menentukan nilai yang sangat kecil. Semua nilai tipe lain lebih besar dari nilai tipe INF_MIN. INF_MAX menentukan nilai yang sangat besar. Semua nilai tipe lain lebih kecil dari nilai tipe INF_MAX.
Baris dalam tabel data diurutkan dalam urutan naik berdasarkan nilai primary key. Rentang yang digunakan untuk membaca data adalah interval tertutup kiri, terbuka kanan. Jika data dibaca dalam arah maju, baris yang nilai primary key-nya lebih besar dari atau sama dengan nilai primary key awal tetapi kurang dari nilai primary key akhir dikembalikan. |
exclusiveEndPrimaryKey | |
limit | Jumlah maksimum baris yang ingin Anda kembalikan. Nilai parameter ini harus lebih besar dari 0. Tablestore menghentikan operasi ketika jumlah maksimum baris yang dapat dikembalikan dalam arah maju atau mundur tercapai, meskipun beberapa baris dalam rentang yang ditentukan belum dikembalikan. Anda dapat menggunakan nilai parameter nextStartPrimaryKey yang dikembalikan dalam respons untuk membaca data dalam permintaan berikutnya. |
columnsToGet | Kolom yang ingin Anda kembalikan. Anda dapat menentukan nama kolom primary key atau kolom atribut.
Catatan
|
maxVersions | Jumlah maksimum versi data yang dapat dikembalikan. Penting Anda harus mengonfigurasi setidaknya salah satu parameter berikut: maxVersions dan timeRange.
|
timeRange | Rentang versi atau versi spesifik yang ingin Anda kembalikan. Untuk informasi lebih lanjut, lihat TimeRange. Penting Anda harus mengonfigurasi setidaknya salah satu parameter berikut: maxVersions dan timeRange.
Anda hanya perlu mengonfigurasi salah satu dari timestamp dan Nilai valid parameter timeRange: 0 hingga |
filter | Filter yang ingin Anda gunakan untuk menyaring hasil kueri di sisi server. Hanya baris yang memenuhi kondisi filter yang dikembalikan. Untuk informasi lebih lanjut, lihat Konfigurasi filter. Catatan Jika Anda mengonfigurasi parameter columnsToGet dan filter, Tablestore mengkueri kolom yang ditentukan oleh parameter columnsToGet, lalu mengembalikan baris yang memenuhi kondisi filter. |
nextStartPrimaryKey | Nilai primary key awal untuk permintaan baca berikutnya. Nilai parameter nextStartPrimaryKey dapat digunakan untuk menentukan apakah semua data telah dibaca.
|
Contoh
Membaca data yang nilai primary key-nya berada dalam rentang tertentu
Kode sampel berikut menunjukkan cara membaca data dengan nilai primary key dalam rentang tertentu dalam arah maju. Jika nilai parameter nextStartPrimaryKey kosong dalam respons, semua data yang nilai primary key-nya berada dalam rentang yang ditentukan telah dibaca. Jika tidak, kirim permintaan lain hingga semua data dalam rentang tersebut dikembalikan.
private static void getRange(SyncClient client, String startPkValue, String endPkValue) {
// Tentukan nama tabel data.
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// Tentukan primary key awal.
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(startPkValue));
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// Tentukan primary key akhir.
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(endPkValue));
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
rangeRowQueryCriteria.setMaxVersions(1);
System.out.println("Hasil GetRange:");
while (true) {
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
for (Row row : getRangeResponse.getRows()) {
System.out.println(row);
}
// Jika nilai parameter nextStartPrimaryKey tidak null, lanjutkan operasi baca.
if (getRangeResponse.getNextStartPrimaryKey() != null) {
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
} else {
break;
}
}
} Membaca data dalam rentang yang ditentukan oleh nilai kolom primary key pertama
Kode sampel berikut menunjukkan cara membaca data dalam rentang yang ditentukan oleh nilai kolom primary key pertama dalam arah maju. Jika nilai parameter nextStartPrimaryKey adalah null dalam respons, semua data dalam rentang yang ditentukan telah dibaca. Jika tidak, kirim permintaan lain hingga semua data dalam rentang tersebut dikembalikan.
private static void getRange(SyncClient client, String startPkValue, String endPkValue) {
// Tentukan nama tabel data.
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// Tentukan primary key awal. Dalam contoh ini, dua kolom primary key digunakan.
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString(startPkValue));// Atur nilai kolom primary key pertama ke nilai tertentu.
primaryKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.INF_MIN);// Atur nilai kolom primary key kedua ke nilai yang sangat kecil.
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// Tentukan primary key akhir.
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString(endPkValue));// Atur nilai kolom primary key pertama ke nilai tertentu.
primaryKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.INF_MAX);// Atur nilai kolom primary key kedua ke nilai yang sangat besar.
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
rangeRowQueryCriteria.setMaxVersions(1);
System.out.println("Hasil GetRange:");
while (true) {
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
for (Row row : getRangeResponse.getRows()) {
System.out.println(row);
}
// Jika nilai parameter nextStartPrimaryKey tidak null, lanjutkan operasi baca.
if (getRangeResponse.getNextStartPrimaryKey() != null) {
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
} else {
break;
}
}
} Membaca data yang nilai primary key-nya berada dalam rentang tertentu dan menggunakan ekspresi reguler untuk menyaring data dalam kolom tertentu
Kode sampel berikut menunjukkan cara membaca data yang nilai primary key-nya berada dalam rentang ["pk:2020-01-01.log", "pk:2021-01-01.log") dari kolom Col1 dan menggunakan ekspresi reguler untuk menyaring data dalam kolom Col1.
private static void getRange(SyncClient client) {
// Tentukan nama tabel data.
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// Tentukan ["pk:2020-01-01.log", "pk:2021-01-01.log") sebagai rentang primary key dari data yang ingin Anda baca. Rentang tersebut adalah interval tertutup kiri, terbuka kanan.
PrimaryKey pk0 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("2020-01-01.log"))
.build();
PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("2021-01-01.log"))
.build();
criteria.setInclusiveStartPrimaryKey(pk0);
criteria.setExclusiveEndPrimaryKey(pk1);
// Atur parameter MaxVersions ke 1 untuk membaca versi terbaru data.
criteria.setMaxVersions(1);
// Konfigurasikan filter. Baris dikembalikan ketika cast<int>(regex(Col1)) lebih besar dari 100.
RegexRule regexRule = new RegexRule("t1:([0-9]+),", RegexRule.CastType.VT_INTEGER);
SingleColumnValueRegexFilter filter = new SingleColumnValueRegexFilter("Col1",
regexRule,SingleColumnValueRegexFilter.CompareOperator.GREATER_THAN,ColumnValue.fromLong(100));
criteria.setFilter(filter);
while (true) {
GetRangeResponse resp = client.getRange(new GetRangeRequest(criteria));
for (Row row : resp.getRows()) {
// lakukan sesuatu
System.out.println(row);
}
if (resp.getNextStartPrimaryKey() != null) {
criteria.setInclusiveStartPrimaryKey(resp.getNextStartPrimaryKey());
} else {
break;
}
}
}Membaca data yang nilai primary key-nya berada dalam rentang tertentu menggunakan iterator
Kode sampel berikut menunjukkan cara memanggil operasi createRangeIterator untuk membaca data dengan nilai primary key dalam rentang tertentu menggunakan iterator.
private static void getRangeByIterator(SyncClient client, String startPkValue, String endPkValue) {
// Tentukan nama tabel data.
RangeIteratorParameter rangeIteratorParameter = new RangeIteratorParameter("<TABLE_NAME>");
// Tentukan primary key awal.
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(startPkValue));
rangeIteratorParameter.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// Tentukan primary key akhir.
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(endPkValue));
rangeIteratorParameter.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
rangeIteratorParameter.setMaxVersions(1);
Iterator<Row> iterator = client.createRangeIterator(rangeIteratorParameter);
System.out.println("Hasil yang diperoleh saat menggunakan iterator dalam operasi GetRange:");
while (iterator.hasNext()) {
Row row = iterator.next();
System.out.println(row);
}
} Membaca data secara konkuren
Tablestore SDK for Java menyediakan kelas TableStoreReader yang mengenkapsulasi operasi BatchGetRow. Anda dapat menggunakan kelas ini untuk melakukan kueri data secara konkuren dalam tabel data. TableStoreReader juga mendukung kueri multi-tabel, statistik status kueri, callback tingkat baris, dan konfigurasi kustom.
TableStoreReader didukung oleh Tablestore SDK for Java V5.16.1 dan versi yang lebih baru. Pastikan Anda menggunakan versi SDK yang valid. Untuk informasi tentang sejarah versi Tablestore SDK for Java, lihat Sejarah Versi Tablestore SDK for Java.
Memulai
Konstruksi TableStoreReader.
// Tentukan nama instance. String instanceName = "yourInstanceName"; // Tentukan endpoint instance. String endpoint = "yourEndpoint"; // Dapatkan ID AccessKey dan Rahasia AccessKey dari variabel lingkungan. String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID"); String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET"); AsyncClientInterface client = new AsyncClient(endpoint, accessKeyId, accessKeySecret, instanceName); TableStoreReaderConfig config = new TableStoreReaderConfig(); ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 4, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(1024)) TableStoreReader reader = new DefaultTableStoreReader(client, config, executor, null);Konstruksi permintaan kueri.
Cached data yang ingin Anda kueri di memori. Anda dapat menambahkan satu atau lebih baris data pada saat yang bersamaan.
PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder() .addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromLong(0)) .addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(0)) .build(); // Tambahkan primary key dengan nilai pk1 untuk mengkueri kolom atribut baris. Future<ReaderResult> readerResult = reader.addPrimaryKeyWithFuture("<TABLE_NAME1>", pk1); // Anda juga dapat menggunakan metode List untuk menambahkan beberapa nilai primary key pada saat yang bersamaan untuk mengkueri baris. List<PrimaryKey> primaryKeyList = new ArrayList<PrimaryKey>(); Future<ReaderResult> readerResult = reader.addPrimaryKeysWithFuture("<TABLE_NAME2>", primaryKeyList);Kueri data.
Kirim permintaan untuk mengkueri data yang dicached di memori. Anda dapat mengkueri data dalam mode sinkron atau asinkron.
Kueri data dalam mode sinkron
reader.flush();Kueri data dalam mode asinkron
reader.send();
Dapatkan hasil kueri.
// Tampilkan informasi tentang kueri yang berhasil dan gagal. for (RowReadResult success : readerResult.get().getSucceedRows()) { System.out.println(success.getRowResult()); } for (RowReadResult fail : readerResult.get().getFailedRows()) { System.out.println(fail.getRowResult()); }Tutup TableStoreReader.
reader.close(); // Tutup klien dan executor berdasarkan kebutuhan bisnis Anda. client.shutdown(); executor.shutdown();
Parameter
Anda dapat memodifikasi TableStoreReaderConfig untuk menentukan konfigurasi kustom untuk TableStoreReader.
Parameter | Deskripsi |
checkTableMeta | Menentukan apakah akan memeriksa skema tabel saat Anda menambahkan nilai primary key dari baris yang ingin Anda kueri. Nilai default: true. Jika Anda tidak ingin memeriksa skema tabel saat Anda menambahkan nilai primary key dari baris yang ingin Anda kueri, atur parameter ini ke false. |
bucketCount | Jumlah bucket cache di memori TableStoreReader. Nilai default: 4. |
bufferSize | Ukuran RingBuffer untuk setiap bucket. Nilai default: 1024. |
concurrency | Konkurensi maksimum yang diizinkan untuk operasi batchGetRow. Nilai default: 10. |
maxBatchRowsCount | Jumlah maksimum baris yang dapat dikueri dengan memanggil operasi batchGetRow. Nilai default: 100. Nilai maksimum: 100. |
defaultMaxVersions | Jumlah maksimum versi data yang dapat dikueri dengan memanggil operasi getRow. Nilai default: 1. |
flushInterval | Interval di mana data yang dicached di memori secara otomatis di-flush. Nilai default: 10000. Unit: milidetik. |
logInterval | Interval di mana status tugas secara otomatis dicetak. Nilai default: 10000. Unit: milidetik. |
Tentukan kondisi kueri
Anda dapat menentukan parameter tingkat tabel untuk mengkueri data, seperti jumlah maksimum versi data, kolom yang ingin Anda kueri, dan rentang waktu di mana Anda ingin mengkueri data.
// Kueri data hingga 10 versi dalam kolom col1 dari tabel yang ditentukan dalam 60 detik terakhir.
// Tentukan nama tabel data.
RowQueryCriteria criteria = new RowQueryCriteria("<TABLE_NAME>");
// Tentukan kolom yang ingin Anda kembalikan.
criteria.addColumnsToGet("col1");
// Tentukan jumlah maksimum versi yang ingin Anda kembalikan.
criteria.setMaxVersions(10);
criteria.setTimeRange(new TimeRange(System.currentTimeMillis() - 60 * 1000, System.currentTimeMillis()));
reader.setRowQueryCriteria(criteria);Kode sampel lengkap
public class TableStoreReaderDemo {
// Tentukan nama instance.
private static final String instanceName = "yourInstanceName";
// Tentukan endpoint instance.
private static final String endpoint = "yourEndpoint";
// Dapatkan ID AccessKey dan Rahasia AccessKey dari variabel lingkungan.
private static final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
private static final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
private static AsyncClientInterface client;
private static ExecutorService executor;
private static AtomicLong succeedRows = new AtomicLong();
private static AtomicLong failedRows = new AtomicLong();
public static void main(String[] args) throws ExecutionException, InterruptedException {
/**
* Langkah 1: Konstruksi TableStoreReader.
*/
// Konstruksi AsyncClient.
client = new AsyncClient(endpoint, accessKeyId, accessKeySecret, instanceName);
// Konstruksi kelas konfigurasi TableStoreReader.
TableStoreReaderConfig config = new TableStoreReaderConfig();
{
// Parameter berikut memiliki nilai default dan dapat dibiarkan kosong.
// Periksa skema tabel sebelum Anda menambahkan nilai primary key dari baris yang ingin Anda kueri.
config.setCheckTableMeta(true);
// Tentukan jumlah maksimum baris yang dapat Anda kueri menggunakan permintaan. Dalam contoh ini, hingga 100 baris dapat dikueri menggunakan permintaan.
config.setMaxBatchRowsCount(100);
// Tentukan jumlah maksimum versi yang dapat dikembalikan.
config.setDefaultMaxVersions(1);
// Jumlah total permintaan konkuren yang dapat dikirim.
config.setConcurrency(16);
// Tentukan jumlah bucket di memori.
config.setBucketCount(4);
// Tentukan interval di mana semua data yang dicached di-flush.
config.setFlushInterval(10000);
// Tentukan interval di mana status TableStoreReader dicatat.
config.setLogInterval(10000);
}
// Konstruksi executor yang digunakan untuk mengirim permintaan.
ThreadFactory threadFactory = new ThreadFactory() {
private final AtomicInteger counter = new AtomicInteger(1);
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "reader-" + counter.getAndIncrement());
}
};
executor = new ThreadPoolExecutor(4, 4, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(1024), threadFactory, new ThreadPoolExecutor.CallerRunsPolicy());
// Konstruksi fungsi callback TableStoreReader.
TableStoreCallback<PrimaryKeyWithTable, RowReadResult> callback = new TableStoreCallback<PrimaryKeyWithTable, RowReadResult>() {
@Override
public void onCompleted(PrimaryKeyWithTable req, RowReadResult res) {
succeedRows.incrementAndGet();
}
@Override
public void onFailed(PrimaryKeyWithTable req, Exception ex) {
failedRows.incrementAndGet();
}
};
TableStoreReader reader = new DefaultTableStoreReader(client, config, executor, callback);
/**
* Langkah 2: Konstruksi permintaan.
*/
// Tambahkan nilai primary key dari baris yang ingin Anda kueri ke memori.
PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromLong(0))
.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(0))
.build();
reader.addPrimaryKey("<TABLE_NAME1>", pk1);
// Tambahkan nilai primary key dari baris lain yang ingin Anda kueri ke memori dan dapatkan objek Future.
PrimaryKey pk2 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromLong(0))
.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(0))
.build();
Future<ReaderResult> readerResult = reader.addPrimaryKeyWithFuture("<TABLE_NAME2>", pk2);
/**
* Langkah 3: Kueri data.
*/
// Kirim data di memori dalam mode asinkron.
reader.send();
/**
* Langkah 4: Dapatkan hasil kueri.
*/
// Tampilkan informasi tentang kueri yang berhasil dan gagal.
for (RowReadResult success : readerResult.get().getSucceedRows()) {
System.out.println(success.getRowResult());
}
for (RowReadResult fail : readerResult.get().getFailedRows()) {
System.out.println(fail.getRowResult());
}
/**
* Langkah 5: Tutup TableStoreReader.
*/
reader.close();
client.shutdown();
executor.shutdown();
}
}Referensi
Jika Anda ingin menggunakan indeks untuk mempercepat kueri data, Anda dapat menggunakan fitur indeks sekunder atau indeks pencarian. Untuk informasi lebih lanjut, lihat Indeks Sekunder atau Indeks Pencarian.
Jika Anda ingin memvisualisasikan data dalam tabel, Anda dapat menghubungkan tabel ke DataV atau Grafana. Untuk informasi lebih lanjut, lihat Visualisasi Data.
Jika Anda ingin mengunduh data dari tabel ke file lokal, Anda dapat menggunakan DataX atau CLI Tablestore. Untuk informasi lebih lanjut, lihat Unduh Data Tablestore ke File Lokal.
Jika Anda ingin menghitung dan menganalisis data dalam tabel, Anda dapat menggunakan fitur kueri SQL Tablestore. Untuk informasi lebih lanjut, lihat Kueri SQL.
CatatanAnda juga dapat menggunakan mesin komputasi seperti MaxCompute, Spark, Hive, HadoopMR, Function Compute, dan Flink untuk menghitung dan menganalisis data dalam tabel. Untuk informasi lebih lanjut, lihat Ikhtisar.