Filter memungkinkan pemfilteran sisi server terhadap hasil baca, hanya mengembalikan baris yang memenuhi kriteria yang Anda tentukan. Pendekatan ini mengurangi transfer data jaringan dan mempercepat waktu respons.
Kasus penggunaan
Memfilter hasil secara langsung
Pertimbangkan meteran pintar dalam skenario Internet of Things (IoT). Meteran tersebut menulis data seperti tegangan, arus, dan penggunaan ke Tablestore dengan frekuensi tetap, misalnya setiap 15 detik. Untuk analisis harian, Anda perlu mengidentifikasi apakah meteran mengalami anomali tegangan dan mengambil data status lain dari waktu-waktu tersebut untuk menentukan apakah inspeksi saluran listrik diperlukan.
Tanpa filter, Anda akan menggunakan operasi
GetRangeuntuk membaca semua 5.760 catatan pemantauan untuk satu meteran dalam satu hari. Anda kemudian harus memproses 5.760 catatan tersebut di sisi client untuk menemukan 10 catatan yang menunjukkan ketidakstabilan tegangan.Dengan filter, server hanya mengembalikan 10 catatan yang diperlukan. Pendekatan ini secara signifikan mengurangi transfer data dan menghilangkan pemfilteran sisi client, sehingga menghemat biaya pengembangan.
Memfilter dengan ekspresi reguler dan konversi tipe
Jika suatu kolom menyimpan data dalam format kustom, seperti string berformat JSON, Anda dapat memfilter berdasarkan subfield di dalam string tersebut. Untuk melakukannya, gunakan ekspresi reguler untuk mencocokkan dan mengekstrak nilai subfield, ubah ke tipe data yang diinginkan, lalu terapkan filter.
Sebagai contoh, sebuah kolom menyimpan data dalam format
{cluster_name:name1,lastupdatetime:12345}. Untuk mengkueri baris di manalastupdatetime>12345, Anda dapat menggunakan ekspresi regulerlastupdatetime:([0-9]+)}untuk mengekstrak nilai subfield tersebut. Anda kemudian dapat mengonversi nilai yang diekstrak menjadi tipe numerik dan melakukan perbandingan untuk menemukan baris yang diinginkan.
Ikhtisar
Anda dapat menggunakan filter dengan operasi GetRow, BatchGetRow, atau GetRange untuk hanya mengembalikan baris yang memenuhi kondisi yang Anda tentukan. Filter tidak mengubah semantik asli atau batasan operasi-operasi tersebut. Untuk informasi selengkapnya, lihat Baca data.
Filter menyediakan opsi konfigurasi berikut:
Gunakan parameter PassIfMissing untuk menentukan perilaku filter ketika kolom yang dirujuk tidak ada dalam suatu baris.
Jika kolom yang dirujuk memiliki beberapa versi, Anda dapat mengonfigurasi filter untuk hanya membandingkan nilai versi terbaru.
Gunakan ekspresi reguler untuk mencocokkan nilai subfield.
Buat kondisi filter komposit dengan menggunakan operator relasional dan operator logika.
Tablestore menyediakan SingleColumnValueFilter, SingleColumnValueRegexFilter, dan CompositeColumnValueFilter. Filter-filter ini menentukan apakah suatu baris dikembalikan berdasarkan nilai satu atau beberapa kolom referensi.
Filter | Deskripsi |
Memfilter baris berdasarkan nilai satu kolom referensi. | |
Memungkinkan Anda menggunakan ekspresi reguler untuk mencocokkan substring dalam kolom bertipe string. Anda kemudian dapat mengubah substring yang cocok menjadi string, integer, atau double dan memfilter berdasarkan nilai yang telah dikonversi. Ekspresi reguler harus memenuhi ketentuan berikut:
| |
Memfilter baris dengan menggabungkan secara logis kondisi pada beberapa kolom. |
Catatan penggunaan
Kondisi filter mendukung operator relasional (=, !=, >, >=, <, <=) dan operator logika (NOT, AND, OR). Anda dapat menggabungkan hingga 10 kondisi.
Kolom yang dirujuk oleh filter harus disertakan dalam permintaan baca. Jika tidak, filter tidak dapat mengakses nilainya.
Saat Anda menggunakan operasi
GetRange, satu pemindaian tidak boleh melebihi 5.000 baris atau 4 MB data.Jika tidak ada baris dalam 5.000 baris atau 4 MB data yang dipindai yang sesuai dengan kondisi filter, bidang
Rowsdalam respons akan kosong, tetapiNextStartPrimaryKeymungkin tidak kosong. Dalam kasus ini, Anda harus melanjutkan pembacaan dengan menggunakanNextStartPrimaryKeyyang dikembalikan hingga nilainya kosong.
Penggunaan
Anda hanya dapat menggunakan filter melalui SDK.
Anda dapat menggunakan filter dengan Tablestore SDK untuk Java, Tablestore SDK untuk Go, Tablestore SDK untuk Python, Tablestore SDK untuk Node.js, Tablestore SDK untuk .NET, dan Tablestore SDK untuk PHP. Contoh berikut menggunakan Tablestore SDK untuk Java.
SingleColumnValueFilter
Kode contoh berikut menunjukkan cara membaca data versi terbaru dari suatu baris dalam tabel data dan menggunakan filter untuk memfilter data berdasarkan nilai kolom Col0.
private static void getRow(SyncClient client, String pkValue) {
// Membangun primary key.
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// Menentukan nama tabel dan primary key untuk membaca satu baris data.
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
// Mengatur parameter MaxVersions ke 1 untuk membaca data versi terbaru.
criteria.setMaxVersions(1);
// Mengonfigurasi 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 tersebut tidak dikembalikan.
singleColumnValueFilter.setPassIfMissing(false);
criteria.setFilter(singleColumnValueFilter);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
System.out.println("Pembacaan selesai. Hasil:");
System.out.println(row);
}SingleColumnValueRegexFilter
Kode contoh 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) {
// Menentukan nama tabel data.
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// Menentukan ["pk:2020-01-01.log", "pk:2021-01-01.log") sebagai rentang primary key data yang ingin dibaca. Rentang ini merupakan 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);
// Mengatur parameter MaxVersions ke 1 untuk membaca data versi terbaru.
criteria.setMaxVersions(1);
// Mengonfigurasi 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;
}
}
}CompositeColumnValueFilter
Contoh berikut menunjukkan cara mengembalikan baris di mana primary key berada dalam rentang ["a","h") dan kondisi berikut terpenuhi: (Col0 == 0 AND Col1 > 100) OR (Col2 <= 10).
private static void getRange(SyncClient client) {
// Menentukan nama tabel.
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// Mengatur rentang primary key sebagai interval tertutup-kiri, 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);
// Mengatur kueri untuk hanya membaca versi terbaru.
criteria.setMaxVersions(1);
// Kondisi untuk composite1 adalah (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);
// Kondisi untuk composite2 adalah ( (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
Filter tidak mengubah aturan penagihan yang berlaku.
Filter mengurangi jumlah data yang dikembalikan, tetapi tidak mengurangi unit kapasitas baca (CUs) yang dikonsumsi. Hal ini karena pemfilteran terjadi di server setelah data dibaca dari disk, sehingga jumlah operasi I/O disk tetap tidak berubah. Sebagai contoh, jika operasi GetRange membaca 100 baris dengan total 200 KB dan mengonsumsi 50 read CUs, penerapan filter yang hanya mengembalikan 10 baris (20 KB) tetap mengonsumsi 50 read CUs.
FAQ
Referensi
Jika aplikasi Anda perlu mengkueri data berdasarkan atribut yang berbeda, Anda dapat menetapkan atribut-atribut tersebut sebagai kolom kunci primer dari indeks sekunder untuk memungkinkan pencarian cepat. Untuk informasi selengkapnya, lihat Indeks sekunder.
Untuk skenario bisnis yang memerlukan kueri multidimensi (seperti kueri pada kolom non-primary key, kueri komposit, atau pencarian fuzzy) atau analisis data (seperti menemukan agregat, menghitung jumlah baris, atau mengelompokkan data), Anda dapat menggunakan indeks pencarian. Tetapkan atribut yang diperlukan sebagai bidang indeks pencarian untuk mengkueri dan menganalisis data Anda. Untuk informasi selengkapnya, lihat Indeks pencarian.