全部产品
Search
文档中心

Tablestore:Membaca data

更新时间:Jul 02, 2025

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.

Penting

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

Membaca Satu Baris Data

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.

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.

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.

Membaca Data secara Konkuren

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.

  • Jika Anda tidak menentukan kolom, semua data dalam baris dikembalikan.

  • Jika Anda menentukan kolom tetapi baris tidak mengandung kolom yang ditentukan, nilai pengembalian adalah null. Jika baris mengandung beberapa kolom yang ditentukan, data dalam beberapa kolom yang ditentukan dari baris tersebut dikembalikan.

Catatan
  • Secara default, Tablestore mengembalikan data dari semua kolom baris saat Anda mengkueri baris. Anda dapat mengonfigurasi parameter columnsToGet untuk mengembalikan kolom tertentu. Misalnya, jika col0 dan col1 ditentukan untuk parameter columnsToGet, hanya nilai kolom col0 dan col1 yang dikembalikan.

  • Jika Anda mengonfigurasi parameter columnsToGet dan filter, Tablestore mengkueri kolom yang ditentukan oleh parameter columnsToGet, lalu mengembalikan baris yang memenuhi kondisi filter.

maxVersions

Jumlah maksimum versi data yang dapat dikembalikan.

Penting

Anda harus mengonfigurasi setidaknya salah satu parameter berikut: maxVersions dan timeRange.

  • Jika Anda hanya mengonfigurasi parameter maxVersions, data dari jumlah versi yang ditentukan dikembalikan dari versi terbaru hingga versi paling awal.

  • Jika Anda hanya mengonfigurasi parameter timeRange, semua data yang versinya berada dalam rentang waktu yang ditentukan atau data dari versi yang ditentukan dikembalikan.

  • Jika Anda mengonfigurasi parameter maxVersions dan timeRange, data dari jumlah versi yang ditentukan dalam rentang waktu yang ditentukan dikembalikan dari versi terbaru hingga versi paling awal.

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.

  • Jika Anda hanya mengonfigurasi parameter maxVersions, data dari jumlah versi yang ditentukan dikembalikan dari versi terbaru hingga versi paling awal.

  • Jika Anda hanya mengonfigurasi parameter timeRange, semua data yang versinya berada dalam rentang waktu yang ditentukan atau data dari versi yang ditentukan dikembalikan.

  • Jika Anda mengonfigurasi parameter maxVersions dan timeRange, data dari jumlah versi yang ditentukan dalam rentang waktu yang ditentukan dikembalikan dari versi terbaru hingga versi paling awal.

  • Untuk mengkueri data yang versinya berada dalam rentang waktu yang ditentukan, Anda harus mengonfigurasi parameter start dan end. Parameter start menentukan timestamp awal. Parameter end menentukan timestamp akhir. Rentang yang ditentukan adalah interval tertutup kiri, terbuka kanan dalam format [start, end).

  • Untuk mengkueri data dari versi tertentu, Anda harus mengonfigurasi parameter timestamp. Parameter timestamp menentukan timestamp tertentu.

Anda hanya perlu mengonfigurasi salah satu dari timestamp dan [start, end).

Nilai valid parameter timeRange: 0 hingga Long.MAX_VALUE. Unit: milidetik.

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 ColumnsToGet diatur 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.

Catatan

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.

  • Jika Anda mengatur parameter ini ke FORWARD, nilai parameter inclusiveStartPrimaryKey harus kurang dari nilai parameter exclusiveEndPrimaryKey, dan baris dalam respons diurutkan dalam urutan naik berdasarkan nilai primary key.

  • Jika Anda mengatur parameter ini ke BACKWARD, nilai parameter inclusiveStartPrimaryKey harus lebih besar dari nilai parameter exclusiveEndPrimaryKey, dan baris dalam respons diurutkan dalam urutan turun berdasarkan nilai primary key.

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 [A, B) untuk tabel, Tablestore mengembalikan baris yang nilai primary key-nya lebih besar dari atau sama dengan Nilai A tetapi kurang dari Nilai B dalam urutan naik dari Nilai A ke Nilai B. Jika Anda mengatur parameter direction ke BACKWARD dan menentukan rentang [B, A) untuk tabel, Tablestore mengembalikan baris yang nilai primary key-nya kurang dari atau sama dengan Nilai B dan lebih besar dari Nilai A dalam urutan turun dari Nilai B ke Nilai A.

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.

  • Parameter inclusiveStartPrimaryKey menentukan primary key awal. Jika baris yang berisi primary key awal ada, baris data tersebut dikembalikan.

  • Parameter exclusiveEndPrimaryKey menentukan primary key akhir. Terlepas dari apakah baris yang berisi primary key akhir ada, baris data tersebut tidak dikembalikan.

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.

  • Jika Anda tidak menentukan kolom, semua data dalam baris dikembalikan.

  • Jika Anda menentukan kolom tetapi baris tidak mengandung kolom yang ditentukan, nilai pengembalian adalah null. Jika baris mengandung beberapa kolom yang ditentukan, data dalam beberapa kolom yang ditentukan dari baris tersebut dikembalikan.

Catatan
  • Secara default, Tablestore mengembalikan data dari semua kolom baris saat Anda mengkueri baris. Anda dapat mengonfigurasi parameter columnsToGet untuk mengembalikan kolom tertentu. Misalnya, jika col0 dan col1 ditentukan untuk parameter columnsToGet, hanya nilai kolom col0 dan col1 yang dikembalikan.

  • Jika baris berada dalam rentang yang ditentukan berdasarkan nilai primary key tetapi tidak mengandung kolom yang ditentukan yang ingin Anda kembalikan, respons tidak menyertakan baris tersebut.

  • Jika Anda mengonfigurasi parameter columnsToGet dan filter, Tablestore mengkueri kolom yang ditentukan oleh parameter columnsToGet, lalu mengembalikan baris yang memenuhi kondisi filter.

maxVersions

Jumlah maksimum versi data yang dapat dikembalikan.

Penting

Anda harus mengonfigurasi setidaknya salah satu parameter berikut: maxVersions dan timeRange.

  • Jika Anda hanya mengonfigurasi parameter maxVersions, data dari jumlah versi yang ditentukan dikembalikan dari versi terbaru hingga versi paling awal.

  • Jika Anda hanya mengonfigurasi parameter timeRange, semua data yang versinya berada dalam rentang waktu yang ditentukan atau data dari versi yang ditentukan dikembalikan.

  • Jika Anda mengonfigurasi parameter maxVersions dan timeRange, data dari jumlah versi yang ditentukan dalam rentang waktu yang ditentukan dikembalikan dari versi terbaru hingga versi paling awal.

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.

  • Jika Anda hanya mengonfigurasi parameter maxVersions, data dari jumlah versi yang ditentukan dikembalikan dari versi terbaru hingga versi paling awal.

  • Jika Anda hanya mengonfigurasi parameter timeRange, semua data yang versinya berada dalam rentang waktu yang ditentukan atau data dari versi yang ditentukan dikembalikan.

  • Jika Anda mengonfigurasi parameter maxVersions dan timeRange, data dari jumlah versi yang ditentukan dalam rentang waktu yang ditentukan dikembalikan dari versi terbaru hingga versi paling awal.

  • Untuk mengkueri data yang versinya berada dalam rentang waktu yang ditentukan, Anda harus mengonfigurasi parameter start dan end. Parameter start menentukan timestamp awal. Parameter end menentukan timestamp akhir. Rentang yang ditentukan adalah interval tertutup kiri, terbuka kanan dalam format [start, end).

  • Untuk mengkueri data dari versi tertentu, Anda harus mengonfigurasi parameter timestamp. Parameter timestamp menentukan timestamp tertentu.

Anda hanya perlu mengonfigurasi salah satu dari timestamp dan [start, end).

Nilai valid parameter timeRange: 0 hingga Long.MAX_VALUE. Unit: milidetik.

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.

  • Jika nilai parameter nextStartPrimaryKey tidak kosong dalam respons, nilainya dapat digunakan sebagai nilai primary key awal untuk operasi GetRange berikutnya.

  • Jika nilai parameter nextStartPrimaryKey kosong dalam respons, semua data dalam rentang yang ditentukan telah dikembalikan.

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.

Penting

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

  1. 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);
  2. 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);
  3. 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();
  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());
    }
  5. 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.

    Catatan

    Anda 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.