全部产品
Search
文档中心

Tablestore:Skenario

更新时间:Jul 02, 2025

Fitur indeks sekunder memungkinkan Anda membuat indeks pada kolom tertentu. Data dalam tabel indeks yang dihasilkan diurutkan berdasarkan kolom kunci indeks yang ditentukan. Semua data yang ditulis ke tabel data secara otomatis disinkronkan ke tabel indeks. Setelah menulis data ke tabel data, Anda dapat mengambil data dari tabel indeks yang dibuat untuk tabel tersebut, sehingga meningkatkan efisiensi kueri.

Contoh skenario

Topik ini menjelaskan cara menggunakan fitur indeks sekunder untuk mengkueri catatan telepon. Ketika panggilan telepon selesai, informasi tentang panggilan tersebut dicatat dalam tabel data.

Berikut adalah deskripsi kolom kunci utama dan kolom yang telah ditentukan sebelumnya dari tabel data:

  • Kolom CellNumber dan StartTime digunakan sebagai kolom kunci utama tabel data. Nilai dalam kolom CellNumber menunjukkan nomor pemanggil, sedangkan nilai dalam kolom StartTime menunjukkan waktu mulai panggilan telepon.

  • Kolom CalledNumber, Durasi, dan BaseStationNumber digunakan sebagai kolom yang telah ditentukan sebelumnya. Nilai dalam kolom CalledNumber menunjukkan nomor yang dipanggil, nilai dalam kolom Durasi menunjukkan durasi panggilan, dan nilai dalam kolom BaseStationNumber menunjukkan nomor stasiun pangkalan.

Tabel berikut menyajikan data sampel dalam tabel data. Model Wide Column Tablestore mengurutkan baris dalam tabel data berdasarkan kunci utama mereka dan menyediakan operasi GetRange untuk mengkueri data.

CellNumber

StartTime (UNIX timestamp)

CalledNumber

Durasi

BaseStationNumber

123456

1532574644

654321

60

1

234567

1532574714

765432

10

1

234567

1532574734

123456

20

3

345678

1532574795

123456

5

2

345678

1532574861

123456

100

2

456789

1532584054

345678

200

3

Anda dapat menggunakan tabel data, indeks sekunder global, atau indeks sekunder lokal untuk melakukan kueri berikut sesuai dengan kebutuhan bisnis Anda:

  • Kueri baris di mana nilai kolom CellNumber adalah 234567.

  • Kueri baris di mana nilai kolom CalledNumber adalah 123456.

  • Kueri baris di mana nilai kolom BaseStationNumber adalah 2 dan nilai kolom StartTime adalah 1532574740.

  • Kueri nilai kolom Durasi untuk baris di mana nilai kolom BaseStationNumber adalah 3 dan nilai kolom StartTime berkisar dari 1532574861 hingga 1532584054.

  • Kueri total, rata-rata, maksimum, dan minimum durasi panggilan semua panggilan telepon yang diteruskan oleh stasiun pangkalan 3. Nilai kolom StartTime berkisar dari 1532574861 hingga 1532584054.

  • Kueri baris di mana nilai kolom CellNumber adalah 456789 dan nilai kolom CalledNumber adalah 345678.

Kueri Data

Pilih metode yang sesuai untuk mengkueri data berdasarkan persyaratan kueri Anda.

Metode

Tabel berikut menjelaskan cara mengimplementasikan kueri yang berbeda.

Penting
  • Untuk informasi lebih lanjut tentang kode sampel yang digunakan untuk membuat tabel data dan tabel indeks sekunder, lihat Lampiran: Kode sampel untuk membuat tabel data dan tabel indeks sekunder.

    Setelah membuat tabel data, Anda perlu menulis data sampel ke tabel data. Data dalam tabel data secara otomatis disinkronkan ke tabel indeks yang dibuat untuk tabel tersebut. Untuk informasi lebih lanjut tentang cara menulis data, lihat Tulis data.

  • Tablestore secara otomatis menambahkan kolom kunci utama tabel data yang tidak ditentukan sebagai kolom kunci indeks ke tabel indeks yang dibuat untuk tabel data. Kolom kunci utama tabel data dan kolom kunci indeks digunakan sebagai kolom kunci utama tabel indeks.

  • Jika Anda menggunakan indeks sekunder lokal, kolom kunci utama pertama tabel indeks harus sama dengan kolom kunci utama pertama tabel data tempat tabel indeks dibuat.

Kueri

Metode

Kueri baris di mana nilai kolom CellNumber adalah 234567

Anda dapat langsung memanggil operasi GetRange untuk memindai tabel data.

Kueri baris di mana nilai kolom CalledNumber adalah 123456

Buat tabel indeks berdasarkan kolom CalledNumber dan panggil operasi GetRange untuk memindai tabel indeks.

Kueri baris di mana nilai kolom BaseStationNumber adalah 2 dan nilai kolom StartTime adalah 1532574740

Buat tabel indeks berdasarkan kolom BaseStationNumber dan StartTime, lalu panggil operasi GetRange untuk memindai tabel indeks yang tipe indeksnya adalah indeks sekunder global.

Kueri nilai kolom Durasi untuk baris di mana nilai kolom BaseStationNumber adalah 3 dan nilai kolom StartTime berkisar dari 1532574861 hingga 1532584054

Buat tabel indeks berdasarkan kolom BaseStationNumber dan StartTime, tentukan bahwa hanya nilai kolom Durasi yang dikembalikan, lalu panggil operasi GetRange untuk memindai tabel indeks yang tipe indeksnya adalah indeks sekunder global.

Secara manual, Anda dapat mengkueri nilai kolom Durasi dari tabel data atau menentukan kolom Durasi sebagai kolom atribut tabel indeks.

Untuk mengkueri total, rata-rata, maksimum, dan minimum durasi panggilan semua panggilan telepon yang diteruskan oleh stasiun pangkalan 3 dengan waktu mulai berkisar dari 1532574861 hingga 1532584054, gunakan metode ini. Kemudian, lakukan agregasi pada kolom Durasi untuk mendapatkan hasil akhir.

Catatan

Anda juga dapat mengeksekusi pernyataan SQL untuk mendapatkan hasil tanpa perhitungan sisi klien. Untuk informasi lebih lanjut, lihat Kueri data.

Kueri baris di mana nilai kolom CellNumber adalah 456789 dan nilai kolom CalledNumber adalah 345678

Buat tabel indeks berdasarkan kolom CellNumber dan CalledNumber, tentukan kolom Durasi dan BaseStationNumber sebagai kolom atribut tabel indeks, lalu panggil operasi GetRange untuk memindai tabel indeks yang tipe indeksnya adalah indeks sekunder lokal.

Kueri baris di mana nilai kolom CellNumber adalah 234567

Kolom CellNumber adalah kolom kunci utama tabel data. Oleh karena itu, Anda dapat langsung memanggil operasi GetRange untuk memindai tabel data guna mendapatkan baris yang memenuhi kondisi kueri.

Dalam hal ini, tetapkan nilai maksimum dan minimum kolom CellNumber menjadi 234567, serta tetapkan nilai minimum dan maksimum kolom StartTime menjadi 0 dan INT_MAX.

Kode sampel:

// Parameter cellNumber dalam kode sampel sesuai dengan kolom CellNumber dalam tabel data.
private static void getRangeFromMainTable(SyncClient client, long cellNumber){
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(TABLE_NAME);

    // Tentukan kolom kunci utama awal.
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromLong(cellNumber));
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromLong(0));
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // Tentukan kolom kunci utama akhir.
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromLong(cellNumber));
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    String strNum = String.format("%d", cellNumber);
    System.out.println("Nomor seluler" + strNum + "melakukan panggilan berikut:");
    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            System.out.println(row);
        }

        // Jika nilai nextStartPrimaryKey tidak null, lanjutkan membaca data.
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

Kueri baris di mana nilai kolom CalledNumber adalah 123456

Kueri ini menentukan kondisi berdasarkan nilai kolom CalledNumber, yang merupakan kolom yang telah ditentukan sebelumnya dari tabel data. Anda tidak dapat langsung mengkueri dari tabel data. Buat tabel indeks bernama IndexOnBeCalledNumber berdasarkan kolom CalledNumber, tentukan kolom CalledNumber sebagai kolom kunci utama tabel indeks, lalu panggil operasi GetRange untuk memindai tabel indeks guna mendapatkan baris yang memenuhi kondisi kueri.

Kolom kunci utama pertama tabel indeks berbeda dari kolom kunci utama pertama tabel data. Oleh karena itu, tipe indeks adalah indeks sekunder global.

Data dalam tabel indeks

Tabel berikut menjelaskan data dalam tabel indeks IndexOnBeCalledNumber.

PK0

PK1

PK2

CalledNumber

CellNumber

StartTime

123456

234567

1532574734

123456

345678

1532574795

123456

345678

1532574861

345678

456789

1532584054

654321

123456

1532574644

765432

234567

1532574714

Ketika memanggil operasi GetRange untuk mengkueri data, tetapkan nilai maksimum dan minimum kolom CalledNumber menjadi 123456, tetapkan nilai minimum kolom CellNumber dan StartTime menjadi INT_MIN, serta tetapkan nilai maksimum kolom CellNumber dan StartTime menjadi INT_MAX. Kode sampel:

// Parameter calledNumber dalam kode sampel sesuai dengan kolom CalledNumber dalam tabel indeks.
private static void getRangeFromIndexTable(SyncClient client, long calledNumber) {
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(INDEX0_NAME);

    // Tentukan kolom kunci utama awal.
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.fromLong(calledNumber));
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN);
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // Tentukan kolom kunci utama akhir.
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.fromLong(calledNumber));
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    String strNum = String.format("%d", calledNumber);
    System.out.println("Nomor seluler" + strNum + "dipanggil oleh nomor-nomor berikut:");
    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            System.out.println(row);
        }

        // Jika nilai nextStartPrimaryKey tidak null, lanjutkan membaca data.
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

Kueri baris di mana nilai kolom BaseStationNumber adalah 2 dan nilai kolom StartTime adalah 1532574740

Kueri ini menentukan kondisi berdasarkan nilai kolom BaseStationNumber dan StartTime. Kolom BaseStationNumber adalah kolom yang telah ditentukan sebelumnya dari tabel data. Anda tidak dapat langsung mengkueri dari tabel data. Buat tabel indeks bernama IndexOnBaseStation1 berdasarkan kolom BaseStationNumber dan StartTime, tentukan kolom BaseStationNumber dan StartTime sebagai kolom kunci utama tabel indeks, lalu panggil operasi GetRange untuk memindai tabel indeks guna mendapatkan baris yang memenuhi kondisi kueri.

Kolom kunci utama pertama tabel indeks berbeda dari kolom kunci utama pertama tabel data. Oleh karena itu, tipe indeks adalah indeks sekunder global.

Data dalam tabel indeks

Tabel berikut menjelaskan data dalam tabel indeks IndexOnBaseStation1.

PK0

PK1

PK2

BaseStationNumber

StartTime

CellNumber

1

1532574644

123456

1

1532574714

234567

2

1532574795

345678

2

1532574861

345678

3

1532574734

234567

3

1532584054

456789

Ketika memanggil operasi GetRange untuk mengkueri data, tetapkan nilai maksimum dan minimum kolom BaseStationNumber menjadi 2, tetapkan nilai minimum dan maksimum kolom StartTime menjadi 1532574740 dan INT_MAX, serta tetapkan nilai minimum dan maksimum kolom CellNumber menjadi INT_MIN dan INT_MAX. Kode sampel:

// Parameter baseStationNumber dalam kode sampel sesuai dengan kolom BaseStationNumber dalam tabel indeks.
// Parameter startTime dalam kode sampel sesuai dengan kolom StartTime dalam tabel indeks. Parameter startTime menentukan awal rentang waktu untuk dikueri.
private static void getRangeFromIndexTable(SyncClient client,
                                           long baseStationNumber,
                                           long startTime) {
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(INDEX1_NAME);

    // Tentukan kolom kunci utama awal.
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_3, PrimaryKeyValue.fromLong(baseStationNumber));
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromLong(startTime));
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // Tentukan kolom kunci utama akhir.
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_3, PrimaryKeyValue.fromLong(baseStationNumber));
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    String strBaseStationNum = String.format("%d", baseStationNumber);
    String strStartTime = String.format("%d", startTime);
    System.out.println("Semua nomor yang dipanggil yang diteruskan oleh stasiun pangkalan" + strBaseStationNum + "yang dimulai dari" + strStartTime + "terdaftar:");
    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            System.out.println(row);
        }

        // Jika nilai nextStartPrimaryKey tidak null, lanjutkan membaca data.
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

Kueri nilai kolom Durasi untuk baris di mana nilai kolom BaseStationNumber adalah 3 dan nilai kolom StartTime berkisar dari 1532574861 hingga 1532584054

Kueri ini menentukan kondisi berdasarkan nilai kolom BaseStationNumber dan StartTime serta hanya mengembalikan nilai kolom Durasi. Anda dapat mengkueri data dari tabel indeks IndexOnBaseStation1 yang dibuat di bagian Kueri baris di mana nilai kolom BaseStationNumber adalah 2 dan nilai kolom StartTime adalah 1532574740 untuk mendapatkan kunci utama baris yang memenuhi kondisi kueri. Kemudian, kueri data dari tabel data berdasarkan kunci utama untuk mendapatkan nilai kolom Durasi.

Kolom kunci utama pertama tabel indeks berbeda dari kolom kunci utama pertama tabel data. Oleh karena itu, tipe indeks adalah indeks sekunder global.

Kode sampel:

// Parameter baseStationNumber dalam kode sampel sesuai dengan kolom BaseStationNumber dalam tabel indeks.
// Parameter startTime dan endTime dalam kode sampel sesuai dengan kolom StartTime dalam tabel indeks. Parameter startTime dan endTime menentukan awal dan akhir rentang waktu untuk dikueri.
// Parameter DEFINED_COL_NAME_2 dalam kode sampel sesuai dengan kolom Durasi dalam tabel data.
private static void getRowFromIndexAndMainTable(SyncClient client,
 long baseStationNumber,
 long startTime,
 long endTime) {
 RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(INDEX1_NAME);

 // Tentukan kolom kunci utama awal.
 PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
 startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_3, PrimaryKeyValue.fromLong(baseStationNumber));
 startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromLong(startTime));
 startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
 rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

 // Tentukan kolom kunci utama akhir.
 PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
 endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_3, PrimaryKeyValue.fromLong(baseStationNumber));
 endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromLong(endTime));
 endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
 rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

 rangeRowQueryCriteria.setMaxVersions(1);

 String strBaseStationNum = String.format("%d", baseStationNumber);
 String strStartTime = String.format("%d", startTime);
 String strEndTime = String.format("%d", endTime);

 System.out.println("Durasi panggilan yang diteruskan oleh stasiun pangkalan" + strBaseStationNum + "dari" + strStartTime + "hingga" + strEndTime + "terdaftar:");
 while (true) {
 GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
 for (Row row : getRangeResponse.getRows()) {
 PrimaryKey curIndexPrimaryKey = row.getPrimaryKey();
 // Tentukan kolom kunci utama untuk tabel data.
 PrimaryKeyColumn mainCalledNumber = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
 PrimaryKeyColumn callStartTime = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
 PrimaryKeyBuilder mainTablePKBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
 mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, mainCalledNumber.getValue());
 mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, callStartTime.getValue());
 PrimaryKey mainTablePK = mainTablePKBuilder.build(); 

 // Kueri data dari tabel data.
 SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, mainTablePK);
 // Baca data dari kolom Durasi dalam tabel data.
 criteria.addColumnsToGet(DEFINED_COL_NAME_2); 
 // Tetapkan parameter maxVersions ke 1 untuk membaca versi data terbaru.
 criteria.setMaxVersions(1);
 GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
 Row mainTableRow = getRowResponse.getRow();

 System.out.println(mainTableRow);
 }

 // Jika nilai nextStartPrimaryKey tidak null, lanjutkan membaca data.
 if (getRangeResponse.getNextStartPrimaryKey() != null) {
 rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
 } else {
 break;
 }
 }
}

Untuk meningkatkan efisiensi kueri, buat tabel indeks bernama IndexOnBaseStation2 berdasarkan kolom BaseStationNumber dan StartTime dan tentukan kolom Durasi sebagai kolom atribut tabel indeks. Kemudian, panggil operasi GetRange untuk memindai tabel indeks guna mendapatkan baris yang memenuhi kondisi kueri.

Data dalam tabel indeks

Tabel berikut menjelaskan data dalam tabel indeks IndexOnBaseStation2.

PK0

PK1

PK2

Defined0

BaseStationNumber

StartTime

CellNumber

Durasi

1

1532574644

123456

60

1

1532574714

234567

10

2

1532574795

345678

5

2

1532574861

345678

100

3

1532574734

234567

20

3

1532584054

456789

200

Ketika memanggil operasi GetRange untuk mengkueri data, tetapkan nilai maksimum dan minimum kolom BaseStationNumber menjadi 3, tetapkan nilai minimum dan maksimum kolom StartTime menjadi 1532574861 dan 1532584054, serta tetapkan nilai minimum dan maksimum kolom CellNumber menjadi INT_MIN dan INT_MAX.

Kode sampel:

// Parameter baseStationNumber dalam kode sampel sesuai dengan kolom BaseStationNumber dalam tabel indeks.
// Parameter startTime dan endTime dalam kode sampel sesuai dengan kolom StartTime dalam tabel indeks. Parameter startTime dan endTime menentukan awal dan akhir rentang waktu untuk dikueri.
// Parameter DEFINED_COL_NAME_2 dalam kode sampel sesuai dengan kolom Durasi dalam tabel indeks.
private static void getRangeFromIndexTable(SyncClient client,
 long baseStationNumber,
 long startTime,
 long endTime) {
 RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(INDEX2_NAME);

 // Tentukan kolom kunci utama awal.
 PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
 startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_3, PrimaryKeyValue.fromLong(baseStationNumber));
 startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromLong(startTime));
 startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
 rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

 // Tentukan kolom kunci utama akhir.
 PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
 endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_3, PrimaryKeyValue.fromLong(baseStationNumber));
 endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromLong(endTime));
 endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
 rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

 // Tentukan kolom dari mana data dibaca.
 rangeRowQueryCriteria.addColumnsToGet(DEFINED_COL_NAME_2);

 rangeRowQueryCriteria.setMaxVersions(1);

 String strBaseStationNum = String.format("%d", baseStationNumber);
 String strStartTime = String.format("%d", startTime);
 String strEndTime = String.format("%d", endTime);

 System.out.println("Durasi panggilan yang diteruskan oleh stasiun pangkalan" + strBaseStationNum + "dari" + strStartTime + "hingga" + strEndTime + "terdaftar:");
 while (true) {
 GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
 for (Row row : getRangeResponse.getRows()) {
 System.out.println(row);
 }

 // Jika nilai nextStartPrimaryKey tidak null, lanjutkan membaca data.
 if (getRangeResponse.getNextStartPrimaryKey() != null) {
 rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
 } else {
 break;
 }
 }
}

Kueri baris di mana nilai kolom CellNumber adalah 456789 dan nilai kolom CalledNumber adalah 345678

Kueri ini menentukan kondisi berdasarkan nilai kolom CellNumber dan CalledNumber. Kolom CalledNumber adalah kolom yang telah ditentukan sebelumnya dari tabel data. Anda tidak dapat langsung mengkueri dari tabel data. Buat tabel indeks bernama LocalIndexOnBeCalledNumber berdasarkan kolom CellNumber dan CalledNumber, tentukan kolom CellNumber dan CalledNumber sebagai kolom kunci utama tabel indeks, serta tentukan kolom Durasi dan BaseStationNumber sebagai kolom atribut tabel indeks. Kemudian, panggil operasi GetRange untuk memindai tabel indeks guna mendapatkan baris yang memenuhi kondisi kueri.

Kolom kunci utama pertama tabel indeks sama dengan kolom kunci utama pertama tabel data. Oleh karena itu, tipe indeks adalah indeks sekunder lokal.

Data dalam tabel indeks

Tabel berikut menjelaskan data dalam tabel indeks LocalIndexOnBeCalledNumber.

PK0

Defined0

PK1

Defined1

Defined2

CellNumber

CalledNumber

StartTime (UNIX timestamp)

Durasi

BaseStationNumber

123456

654321

1532574644

60

1

234567

123456

1532574734

20

3

234567

765432

1532574714

10

1

345678

123456

1532574795

5

2

345678

123456

1532574861

100

2

456789

345678

1532584054

200

3

Ketika memanggil operasi GetRange untuk mengkueri data, tetapkan nilai maksimum dan minimum kolom CellNumber menjadi 456789, tetapkan nilai maksimum dan minimum kolom CalledNumber menjadi 345678, serta tetapkan nilai minimum dan maksimum kolom StartTime menjadi 0 dan INT_MAX. Kode sampel:

// Parameter cellNumber dan calledNumber dalam kode sampel sesuai dengan kolom CellNumber dan CalledNumber dalam tabel indeks.
private static void getRangeFromLocalIndex(SyncClient client, long cellNumber, long calledNumber){

    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(INDEX3_NAME);

    // Tentukan kolom kunci utama awal.
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromLong(cellNumber));
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.fromLong(calledNumber));
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromLong(0));
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // Tentukan kolom kunci utama akhir.
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromLong(cellNumber));
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.fromLong(calledNumber));
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    String strNum = String.format("%d", cellNumber);
    String strCalledNum = String.format("%d", calledNumber);
    System.out.println("Semua catatan panggilan telepon antara nomor pemanggil" + strNum + "dan nomor yang dipanggil" +strCalledNum+ "terdaftar:");
    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            System.out.println(row);
        }

        // Jika nilai nextStartPrimaryKey tidak null, lanjutkan membaca data.
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

Lampiran: Kode sampel untuk membuat tabel data dan tabel indeks sekunder

Kode sampel berikut menunjukkan cara membuat tabel data dan tabel indeks sekunder yang digunakan dalam topik ini. Tipe indeks mencakup indeks sekunder lokal dan indeks sekunder global.

private static final String TABLE_NAME = "CallRecordTable";
private static final String INDEX0_NAME = "IndexOnBeCalledNumber";
private static final String INDEX1_NAME = "IndexOnBaseStation1";
private static final String INDEX2_NAME = "IndexOnBaseStation2";
private static final String INDEX3_NAME = "LocalIndexOnBeCalledNumber";
private static final String PRIMARY_KEY_NAME_1 = "CellNumber";
private static final String PRIMARY_KEY_NAME_2 = "StartTime";
private static final String DEFINED_COL_NAME_1 = "CalledNumber";
private static final String DEFINED_COL_NAME_2 = "Durasi";
private static final String DEFINED_COL_NAME_3 = "BaseStationNumber";

private static void createTable(SyncClient client) {
    TableMeta tableMeta = new TableMeta(TABLE_NAME);
    tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_1, PrimaryKeyType.INTEGER));
    tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_2, PrimaryKeyType.INTEGER));
    tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_1, DefinedColumnType.INTEGER));
    tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_2, DefinedColumnType.INTEGER));
    tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_3, DefinedColumnType.INTEGER));
    // Tentukan Time to Live (TTL) data. Unit: detik. Nilai -1 menunjukkan bahwa data tidak pernah kedaluwarsa. Anda harus menetapkan nilai timeToLive ke -1 jika tabel data memiliki satu atau lebih tabel indeks.
    int timeToLive = -1; 
    // Tentukan jumlah maksimum versi data yang dapat disimpan. Anda harus menetapkan nilai maxVersions ke 1 jika tabel data memiliki satu atau lebih tabel indeks.
    int maxVersions = 1; 

    TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);

    ArrayList<IndexMeta> indexMetas = new ArrayList<IndexMeta>();
 
    IndexMeta indexMeta0 = new IndexMeta(INDEX0_NAME);
    indexMeta0.addPrimaryKeyColumn(DEFINED_COL_NAME_1);
    indexMetas.add(indexMeta0);
   
    IndexMeta indexMeta1 = new IndexMeta(INDEX1_NAME);
    indexMeta1.addPrimaryKeyColumn(DEFINED_COL_NAME_3);
    indexMeta1.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
    indexMetas.add(indexMeta1);
   
    IndexMeta indexMeta2 = new IndexMeta(INDEX2_NAME);
    indexMeta2.addPrimaryKeyColumn(DEFINED_COL_NAME_3);
    indexMeta2.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
    indexMeta2.addDefinedColumn(DEFINED_COL_NAME_2);
    indexMetas.add(indexMeta2);
 
    IndexMeta indexMeta3 = new IndexMeta(INDEX3_NAME);
    indexMeta3.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
    indexMeta3.addPrimaryKeyColumn(DEFINED_COL_NAME_1);
    indexMeta3.addDefinedColumn(DEFINED_COL_NAME_2);
    indexMeta3.addDefinedColumn(DEFINED_COL_NAME_3);
    // Tetapkan nilai indexUpdateMode ke IUM_SYNC_INDEX.
    indexMeta3.setIndexUpdateMode(IUM_SYNC_INDEX);
    // Tetapkan nilai indexType ke IT_LOCAL_INDEX.
    indexMeta3.setIndexType(IT_LOCAL_INDEX);
    indexMetas.add(indexMeta3);
 
    CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions, indexMetas);

    client.createTable(request);
}