Tablestore mendukung penyaringan data di sisi server berdasarkan kondisi tertentu selama kueri. Gunakan filter dalam Python SDK untuk hanya mengembalikan baris yang memenuhi kriteria filter Anda.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Cara kerja filter
Filter dievaluasi di server setelah Tablestore memindai baris-baris yang sesuai dengan rentang kunci primary. Unit kapasitas baca (RCU) dikonsumsi untuk setiap baris yang dipindai, terlepas dari apakah baris tersebut lolos filter atau tidak. Untuk meminimalkan konsumsi RCU yang tidak perlu, tentukan rentang kunci primary yang tepat sebelum menerapkan filter.
Tablestore menyediakan dua jenis filter:
SingleColumnCondition— menyaring baris berdasarkan nilai satu kolom atribut. Gunakan ini ketika Anda perlu mencocokkan satu kolom terhadap nilai tetap.CompositeColumnCondition— menggabungkan beberapa kondisi dengan operator logika (AND, OR, NOT). Gunakan ini ketika logika filter Anda melibatkan beberapa kolom atau memerlukan ekspresi majemuk. Mendukung hingga 32 kondisi.
SingleColumnCondition
Menyaring baris berdasarkan apakah satu kolom atribut memenuhi kondisi perbandingan tertentu.
class SingleColumnCondition(ColumnCondition)
Contoh kode
Contoh berikut menjalankan kueri rentang untuk baris dengan kunci primary dalam rentang [row1, row3) dan hanya mengembalikan baris di mana kolom atribut col1 sama dengan val1.
try:
# Setel kunci primary awal untuk kueri.
inclusive_start_primary_key = [('id', 'row1')]
# Setel kunci primary akhir untuk kueri. Kunci akhir bersifat eksklusif.
exclusive_end_primary_key = [('id', 'row3')]
# Buat filter dengan kondisi col1 == "val1".
singleColumnCondition = SingleColumnCondition('col1', 'val1', ComparatorType.EQUAL)
# Panggil metode get_range untuk mengkueri data.
consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
inclusive_start_primary_key,
exclusive_end_primary_key,
column_filter=singleColumnCondition)
# Proses hasilnya.
print('* Read CU Cost: %s' % consumed.read)
print('* Write CU Cost: %s' % consumed.write)
print('* Rows Data:')
for row in row_list:
print(row.primary_key, row.attribute_columns)
except Exception as e:
print("Range get failed with error: %s" % e)
-
Untuk mengecualikan baris yang tidak berisi kolom atribut yang ditentukan:
singleColumnCondition.pass_if_missing = False -
Untuk mengevaluasi semua versi data dan mengembalikan baris jika ada versi apa pun yang memenuhi kondisi:
singleColumnCondition.latest_version_only = False
CompositeColumnCondition
Menggabungkan beberapa kondisi filter menggunakan operator logika. Mendukung hingga 32 kondisi dan memungkinkan penumpukan objek CompositeColumnCondition untuk ekspresi kompleks.
class CompositeColumnCondition(ColumnCondition)
Contoh kode
Contoh berikut menjalankan kueri rentang untuk baris dengan kunci primary dalam rentang [row1, row3) dan menerapkan filter majemuk:
(col1 == "val1" OR col2 == "val2") AND col3 == "val3"
try:
# Setel kunci primary awal untuk kueri.
inclusive_start_primary_key = [('id', 'row1')]
# Setel kunci primary akhir untuk kueri. Kunci akhir bersifat eksklusif.
exclusive_end_primary_key = [('id', 'row3')]
# Buat kondisi single-column pertama: col1 == "val1".
singleColumnCondition1 = SingleColumnCondition('col1', 'val1', ComparatorType.EQUAL)
# Buat kondisi single-column kedua: col2 == "val2".
singleColumnCondition2 = SingleColumnCondition('col2', 'val2', ComparatorType.EQUAL)
# Buat kondisi majemuk pertama: col1 == "val1" OR col2 == "val2".
compositeColumnCondition1 = CompositeColumnCondition(LogicalOperator.OR)
compositeColumnCondition1.add_sub_condition(singleColumnCondition1)
compositeColumnCondition1.add_sub_condition(singleColumnCondition2)
# Buat kondisi single-column ketiga: col3 == "val3".
singleColumnCondition3 = SingleColumnCondition('col3', 'val3', ComparatorType.EQUAL)
# Buat kondisi majemuk akhir: (col1 == "val1" OR col2 == "val2") AND col3 == "val3".
compositeColumnCondition2 = CompositeColumnCondition(LogicalOperator.AND)
compositeColumnCondition2.add_sub_condition(compositeColumnCondition1)
compositeColumnCondition2.add_sub_condition(singleColumnCondition3)
# Panggil metode get_range untuk mengkueri data.
consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
inclusive_start_primary_key,
exclusive_end_primary_key,
column_filter=compositeColumnCondition2)
# Proses hasilnya.
print('* Read CU Cost: %s' % consumed.read)
print('* Write CU Cost: %s' % consumed.write)
print('* Rows Data:')
for row in row_list:
print(row.primary_key, row.attribute_columns)
except Exception as e:
print("Range get failed with error: %s" % e)