Jika Anda tidak memiliki persyaratan terkait urutan hasil kueri, Anda dapat menggunakan fitur pemindaian paralel untuk mendapatkan hasil kueri secara efisien.
Prasyarat
Sebuah instance OTSClient telah diinisialisasi. Untuk informasi lebih lanjut, lihat Inisialisasi klien Tablestore.
Sebuah tabel data telah dibuat dan data telah ditulis ke tabel tersebut. Untuk informasi lebih lanjut, lihat Buat tabel data dan Tulis data.
Indeks pencarian telah dibuat untuk tabel data. Untuk informasi lebih lanjut, lihat Buat indeks pencarian.
Parameter
Parameter | Deskripsi | |
table_name | Nama tabel data. | |
index_name | Nama indeks pencarian. | |
scan_query | query | Tipe kueri. Operasi ini mendukung kueri tepat, kueri fuzzy, kueri rentang, kueri geo, dan kueri bersarang, yang serupa dengan yang didukung oleh operasi Pencarian. |
limit | Jumlah maksimum baris yang dapat dikembalikan oleh setiap pemanggilan ParallelScan. | |
max_parallel | Jumlah maksimum tugas pemindaian paralel per permintaan. Jumlah maksimum tugas pemindaian paralel per permintaan bervariasi berdasarkan volume data. Volume data yang lebih besar memerlukan lebih banyak tugas pemindaian paralel per permintaan. Anda dapat menggunakan operasi ComputeSplits untuk menanyakan jumlah maksimum tugas pemindaian paralel per permintaan. | |
current_parallel_id | ID tugas pemindaian paralel dalam permintaan. Nilai valid: [0, max_parallel). | |
token | Token yang digunakan untuk membagi halaman hasil kueri. Hasil dari permintaan ParallelScan berisi token untuk halaman berikutnya. Anda dapat menggunakan token ini untuk mengambil halaman berikutnya. | |
alive_time | Masa berlaku tugas pemindaian paralel saat ini. Masa berlaku ini juga merupakan masa berlaku token. Satuan: detik. Nilai default: 60. Kami menyarankan Anda menggunakan nilai default. Jika permintaan berikutnya tidak dilakukan dalam periode validitas, tidak ada lagi data yang dapat di-query. Waktu validitas token diperbarui setiap kali Anda mengirimkan permintaan. Catatan Sesi akan kedaluwarsa lebih awal jika skema indeks sumber dan indeks canary diubah, server tunggal gagal, atau penyeimbangan beban di sisi server dilakukan. Dalam kasus ini, Anda harus membuat sesi baru. | |
columns_to_get | Nama kolom yang ingin Anda kembalikan untuk setiap baris yang memenuhi kondisi kueri. Untuk mengembalikan semua kolom dalam indeks pencarian, atur parameter return_type ke RETURN_ALL_FROM_INDEX. | |
session_id | ID sesi tugas pemindaian paralel. Anda dapat memanggil operasi ComputeSplits untuk membuat sesi dan menanyakan jumlah maksimum tugas pemindaian paralel yang didukung oleh permintaan pemindaian paralel. | |
Contoh
Kode sampel berikut menunjukkan cara melakukan pemindaian paralel:
def fetch_rows_per_thread(query, session_id, current_thread_id, max_thread_num):
token = None
while True:
try:
scan_query = ScanQuery(query, limit = 20, next_token = token, current_parallel_id = current_thread_id,
max_parallel = max_thread_num, alive_time = 30)
response = client.parallel_scan(
table_name, index_name, scan_query, session_id,
columns_to_get = ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for row in response.rows:
print("%s:%s" % (threading.currentThread().name, str(row)))
if len(response.next_token) == 0:
break
else:
token = response.next_token
except OTSServiceError as e:
print (e)
except OTSClientError as e:
print (e)
def parallel_scan(table_name, index_name):
response = client.compute_splits(table_name, index_name)
query = TermQuery('d', 0.1)
params = []
for i in range(response.splits_size):
params.append((([query, response.session_id, i, response.splits_size], None)))
pool = threadpool.ThreadPool(response.splits_size)
requests = threadpool.makeRequests(fetch_rows_per_thread, params)
[pool.putRequest(req) for req in requests]
pool.wait()