Setelah mengonfigurasi filter, Tablestore akan memfilter hasil kueri di server. Hanya baris yang memenuhi kondisi filter yang akan dikembalikan. Fitur ini mengurangi volume data yang ditransfer dan mempersingkat waktu respons.
Skenario
Filter Hasil Secara Langsung
Sebagai contoh, meteran listrik pintar berbasis Internet of Things (IoT) mencatat tegangan, arus, penggunaan, dan informasi lainnya ke tabel Tablestore setiap 15 detik. Anda ingin menanyakan data tegangan abnormal dan informasi terkait untuk analisis harian guna menentukan apakah perlu memeriksa kabel.
Anda dapat menggunakan operasi GetRange untuk membaca data pemantauan yang dihasilkan dalam satu hari oleh meteran listrik dan menyaring data tersebut (5.760 catatan) untuk mendapatkan 10 catatan yang dikumpulkan ketika tegangan tidak stabil.
Dengan menggunakan filter, hanya 10 catatan yang relevan yang akan dikembalikan. Hal ini mengurangi volume data yang dikembalikan dan menghilangkan kebutuhan untuk pemrosesan data awal, sehingga mengurangi biaya pengembangan.
Filter Hasil Setelah Pencocokan Ekspresi Reguler dan Konversi Data
Jika data disimpan dalam format kustom seperti string JSON dalam kolom dan Anda ingin menanyakan nilai subbidang, Anda dapat menggunakan ekspresi reguler untuk mencocokkan lalu mengubah nilainya menjadi tipe data yang diperlukan. Kemudian, Anda dapat menggunakan filter untuk mendapatkan data yang dibutuhkan.
Sebagai contoh, data yang disimpan dalam kolom berada dalam format
{cluster_name:name1,lastupdatetime:12345}. Jika Anda perlu memfilter dan menanyakan nilai dari barislastupdatetime>12345, Anda dapat menggunakan ekspresi regulerlastupdatetime:([0-9]+)}untuk mencocokkan data subbidang dalam kolom, mengonversi hasil yang cocok menjadi tipe numerik, lalu membandingkan data numerik dengan hasil yang cocok. Dengan cara ini, Anda bisa mendapatkan baris data yang diperlukan.
Ikhtisar
Saat menanyakan data dengan memanggil operasi GetRow, BatchGetRow, atau GetRange, Anda dapat menggunakan filter untuk mengembalikan hanya baris yang memenuhi kondisi filter. Semantik asli dan batasan operasi ini tetap tidak berubah. Untuk informasi lebih lanjut, lihat Baca Data.
Saat menggunakan filter, Anda dapat mengonfigurasi pengaturan berikut sesuai dengan kebutuhan bisnis:
Jika kolom referensi tidak ada dalam baris, konfigurasikan parameter PassIfMissing untuk menentukan apakah baris tersebut akan dikembalikan.
Jika kolom referensi berisi data dari beberapa versi, tentukan apakah hanya versi terbaru dari data yang digunakan untuk perbandingan.
Gunakan ekspresi reguler untuk mencocokkan nilai subbidang.
Gunakan operator relasional dan logika untuk membuat kondisi filter.
Filter yang tersedia adalah SingleColumnValueFilter, SingleColumnValueRegexFilter, dan CompositeColumnValueFilter, yang memfilter baris berdasarkan nilai kolom dari satu atau lebih kolom referensi.
Filter | Deskripsi |
Tentukan apakah akan memfilter baris berdasarkan nilai kolom referensi. | |
Gunakan ekspresi reguler untuk mencocokkan nilai kolom bertipe String dan mengekstrak substring yang cocok. Lalu, ubah tipe data substring yang diekstraksi menjadi String, Integer, atau Double dan filter nilai-nilai setelah konversi. Ekspresi reguler harus memenuhi kondisi berikut:
| |
Tentukan apakah akan memfilter baris berdasarkan kombinasi logis dari hasil pencocokan untuk nilai beberapa kolom referensi. |
Catatan Penggunaan
Kondisi filter mendukung operator relasional =, !=, >, >=, <, dan <= serta operator logika NOT, AND, dan OR. Kondisi filter dapat mencakup hingga 10 subkondisi.
Kolom referensi yang digunakan oleh filter harus termasuk dalam hasil kueri. Jika kolom yang ditentukan tempat data dibaca tidak mencakup kolom referensi, filter tidak dapat menanyakan nilai kolom referensi.
Saat menggunakan operasi GetRange, hingga 5.000 baris atau 4 MB data dapat dipindai sekaligus.
Jika tidak ada data yang memenuhi kondisi filter dalam rentang pemindaian, baris yang dikembalikan akan kosong. Namun, NextStartPrimaryKey mungkin tidak kosong. Jika NextStartPrimaryKey tidak kosong, gunakan nilai parameter tersebut untuk melanjutkan pemindaian sampai nilai return dari NextStartPrimaryKey kosong.
Metode
Filter hanya dapat digunakan melalui Tablestore SDK.
Filter dapat digunakan dengan Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, Tablestore SDK for Node.js, Tablestore SDK for .NET, dan Tablestore SDK for PHP. Contoh ini menggunakan Tablestore SDK for Java.
Gunakan SingleColumnValueFilter untuk memfilter data
Kode sampel berikut menunjukkan cara membaca data versi terbaru dari baris dalam tabel data dan menggunakan filter untuk memfilter 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);
// Setel parameter MaxVersions ke 1 untuk membaca versi terbaru dari 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 SingleColumnValueRegexFilter untuk memfilter data berdasarkan pencocokan ekspresi reguler
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 memfilter 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);
// Setel parameter MaxVersions ke 1 untuk membaca versi terbaru dari 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;
}
}
}Gunakan CompositeColumnValueFilter untuk memfilter data
Kode sampel berikut digunakan untuk mengembalikan baris yang primary key-nya berada dalam rentang ["a","h"). Selain itu, nilai Col0 adalah 0 dan salah satu dari nilai Col1 lebih besar dari 100 atau nilai Col2 kurang dari atau sama dengan 10.
private static void getRange(SyncClient client) {
// Tentukan nama tabel data.
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// Tentukan rentang primary key. Rentang primary key adalah interval tertutup kiri dan terbuka kanan.
PrimaryKey pk0 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("a"))
.build();
PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("h"))
.build();
criteria.setInclusiveStartPrimaryKey(pk0);
criteria.setExclusiveEndPrimaryKey(pk1);
// Setel parameter maxVersions ke 1 untuk membaca versi terbaru dari data.
criteria.setMaxVersions(1);
// Setel kondisi composite1 ke (Col0 == 0) AND (Col1 > 100).
CompositeColumnValueFilter composite1 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.AND);
SingleColumnValueFilter single1 = new SingleColumnValueFilter("Col0",
SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
SingleColumnValueFilter single2 = new SingleColumnValueFilter("Col1",
SingleColumnValueFilter.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
composite1.addFilter(single1);
composite1.addFilter(single2);
// Setel kondisi composite2 ke ( (Col0 == 0) AND (Col1 > 100) ) OR (Col2 <= 10).
CompositeColumnValueFilter composite2 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.OR);
SingleColumnValueFilter single3 = new SingleColumnValueFilter("Col2",
SingleColumnValueFilter.CompareOperator.LESS_EQUAL, ColumnValue.fromLong(10));
composite2.addFilter(composite1);
composite2.addFilter(single3);
criteria.setFilter(composite2);
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;
}
}
}Penagihan
Implementasi filter tidak memengaruhi aturan penagihan yang ada.
Meskipun filter mengurangi volume data yang dikembalikan, penggunaan disk I/O tetap tidak berubah karena penyaringan dilakukan di server sebelum data dikembalikan. Oleh karena itu, jumlah unit bacaan (CUs) yang sama dikonsumsi baik filter digunakan maupun tidak. Sebagai contoh, ketika Anda memanggil operasi GetRange untuk membaca 100 rekaman (200 KB) data lalu memfilter rekaman tersebut untuk mendapatkan 10 rekaman (20 KB), 50 unit bacaan dikonsumsi.
FAQ
Bagaimana cara memilih antara indeks sekunder dan indeks pencarian?
Referensi
Jika aplikasi perlu menggunakan atribut berbeda sebagai kondisi kueri untuk menanyakan data, Anda dapat menentukan atribut-atribut ini sebagai kolom primary key dari tabel indeks sekunder untuk mempercepat kueri. Untuk informasi lebih lanjut, lihat Indeks Sekunder.
Jika bisnis Anda memerlukan kueri multi-dimensi dan analisis data, Anda dapat membuat indeks pencarian dan menentukan atribut yang diperlukan sebagai bidang indeks pencarian. Lalu, Anda dapat menanyakan dan menganalisis data dengan menggunakan indeks pencarian. Kueri multi-dimensi mencakup kueri berdasarkan kolom non-primary key, kueri Boolean, dan kueri fuzzy. Persyaratan analisis data mencakup mendapatkan nilai ekstrem, menghitung baris, dan mengelompokkan data. Untuk informasi lebih lanjut, lihat Indeks Pencarian.