Topik ini menjelaskan fitur deduplikasi berbasis bitmap yang disediakan oleh ApsaraDB for SelectDB untuk membantu Anda melakukan deduplikasi data dan mempercepat kueri.
Ikhtisar
ApsaraDB for SelectDB mendukung tipe data bitmap. Dalam model Aggregate key, bidang Value bertipe bitmap dapat digunakan dengan fungsi agregasi irisan dan gabungan koleksi untuk deduplikasi data yang akurat.
Fitur deduplikasi berbasis bitmap dalam gudang data tradisional memiliki performa buruk ketika memproses irisan dan gabungan untuk bitmap dengan ratusan juta elemen atau lebih. Hal ini disebabkan oleh beberapa alasan: Pertama, ketika ukuran bitmap sangat besar (melebihi 1 GB), waktu pemrosesan untuk I/O jaringan dan disk menjadi signifikan lebih lama. Kedua, setelah pemindaian data selesai di kluster, semua data dikirim ke node tingkat atas tunggal untuk perhitungan gabungan, memberikan beban besar pada node tersebut.
ApsaraDB for SelectDB dioptimalkan untuk lingkungan terdistribusi, yaitu dapat membagi nilai kolom bitmap berdasarkan bucket menggunakan algoritma hash. Dengan cara ini, nilai-nilai yang berbeda disimpan di bucket yang berbeda. Ini memastikan bahwa nilai bitmap di bucket yang berbeda ortogonal, sehingga secara signifikan mengurangi kardinalitas. Dalam kasus kueri, bitmap ortogonal di bucket yang berbeda pertama-tama diagregasi dan dihitung, kemudian node tingkat atas menggabungkan nilai-nilai hasil perhitungan dan mengeluarkannya. Ini meningkatkan efisiensi komputasi dan menghilangkan hambatan yang disebabkan oleh komputasi node tunggal di tingkat atas.
Contoh
Buat tabel yang menggunakan model Aggregate key dan memiliki bidang Value bertipe data bitmap. Gunakan fungsi irisan atau gabungan sebagai fungsi agregasi, seperti bitmap_union. Kolom hid dibuat untuk menunjukkan ID bucket. Contoh kode berikut memberikan ilustrasi:
CatatanKonfigurasikan kolom hid dan jumlah bucket dengan tepat. Kardinalitas kolom hid harus minimal lima kali jumlah bucket untuk memastikan distribusi data yang seimbang setelah penggunaan hash bucketing.
CREATE TABLE `user_tag_Bitmap` ( `tag` bigint(20) NULL COMMENT "Tag pengguna", `hid` smallint(6) NULL COMMENT "ID Bucket", `user_id` Bitmap Bitmap_UNION NULL COMMENT "" ) ENGINE=OLAP AGGREGATE KEY(`tag`, `hid`) COMMENT "OLAP" DISTRIBUTED BY HASH(`hid`) BUCKETS 3Kolom hid ditambahkan ke skema tabel untuk menunjukkan rentang nilai kolom user_id sebagai kolom hash bucket.
Impor data.
LOAD LABEL user_tag_Bitmap_test ( DATA INFILE('hdfs://abc') INTO TABLE user_tag_Bitmap COLUMNS TERMINATED BY ',' (tmp_tag, tmp_user_id) SET ( tag = tmp_tag, hid = ceil(tmp_user_id/500), user_id = to_Bitmap(tmp_user_id) ) ) # Catatan: Angka 500 tidak tetap. Anda dapat menyesuaikan angka berdasarkan kebutuhan bisnis Anda.Data yang diimpor berada dalam format berikut. Dua kolom menentukan tag dan ID pengguna.
11111111,1 11111112,2 11111113,3 11111114,4 ...Selama impor data, ApsaraDB for SelectDB memotong rentang nilai bitmap di kolom user_id. Sebagai contoh, nilai HID dari ID pengguna dalam rentang [1,5000000) sama, dan baris dengan nilai HID yang sama dialokasikan ke bucket. Dengan cara ini, nilai bitmap di setiap bucket ortogonal. Fitur ortogonal dari nilai bitmap antar bucket dapat digunakan, yang sangat mengurangi penggunaan sumber daya komputasi untuk irisan dan gabungan koleksi.
Setelah data diimpor, Anda dapat memanggil fungsi bitmap untuk melakukan operasi terkait bitmap. Untuk informasi lebih lanjut tentang fungsi bitmap yang dapat Anda panggil, lihat bagian "Fungsi bitmap" di Referensi SQL.
Fungsi bitmap ortogonal
Fungsi berikut tersedia untuk kueri bitmap dalam skenario ortogonal: Bitmap_orthogonal_intersect, orthogonal_Bitmap_intersect_count, orthogonal_Bitmap_union_count, orthogonal_Bitmap_expr_calculate, dan orthogonal_Bitmap_expr_calculate_count. Bagian berikut menjelaskan fungsi-fungsi tersebut.
Fungsi bitmap ortogonal tidak dapat digunakan dalam tabel partisi. Karena partisi dari tabel partisi ortogonal, data antar partisi tidak dapat dijamin ortogonal. Akibatnya, hasil perhitungan tidak dapat diperkirakan.
Bitmap_orthogonal_intersect
Menghitung irisan bitmap.
Sintaks
orthogonal_Bitmap_intersect(Bitmap_column, column_to_filter, filter_values)Parameter
Parameter | Deskripsi |
Bitmap_column | Nama kolom bitmap. |
column_to_filter | Nama kolom dimensi yang digunakan untuk penyaringan. |
filter_values | Daftar variabel panjang nilai yang digunakan untuk menyaring kolom dimensi tertentu. |
Contoh
SELECT Bitmap_COUNT(orthogonal_Bitmap_intersect(user_id, tag, 13080800, 11110200)) FROM user_tag_Bitmap WHERE tag IN (13080800, 11110200);Selama eksekusi kueri, agregasi dilakukan dalam dua tahap. Pada tahap pertama, ApsaraDB for SelectDB menyaring tag berdasarkan filter_values, kemudian menghitung irisan nilai bitmap dari semua tag yang teragregasi. Pada tahap kedua, ApsaraDB for SelectDB secara iteratif menghitung gabungan semua nilai bitmap yang diperoleh dari tahap pertama.
orthogonal_Bitmap_intersect_count
Menghitung irisan bitmap dan menghitung hasil irisan. Sintaksnya sama dengan intersect_count, tetapi implementasinya berbeda.
Sintaks
orthogonal_Bitmap_intersect_count(Bitmap_column, column_to_filter, filter_values)Parameter
Parameter | Deskripsi |
Bitmap_column | Nama kolom bitmap. |
column_to_filter | Nama kolom dimensi yang digunakan untuk penyaringan. |
filter_values | Daftar variabel panjang nilai yang digunakan untuk menyaring kolom dimensi tertentu. |
Contoh
SELECT orthogonal_Bitmap_intersect_count(user_id, tag, 1150000, 1150001, 390006) FROM user_tag_Bitmap WHERE tag IN (1150000, 1150001, 390006);Selama eksekusi kueri, agregasi dilakukan dalam dua tahap. Pada tahap pertama, ApsaraDB for SelectDB menyaring tag berdasarkan filter_values, kemudian menghitung irisan nilai bitmap dari semua tag yang teragregasi, dan akhirnya menghitung hasil irisan. Pada tahap kedua, ApsaraDB for SelectDB secara iteratif menghitung jumlah semua nilai hitungan yang diperoleh dari tahap pertama.
orthogonal_Bitmap_union_count
Menghitung gabungan nilai bitmap dan menghitung hasil gabungan. Sintaksnya sama dengan Bitmap_union_count, tetapi implementasinya berbeda.
Sintaks
orthogonal_Bitmap_union_count(Bitmap_column)Parameter
Parameter | Deskripsi |
Bitmap_column | Nama kolom bitmap di mana gabungan nilai akan dihitung untuk pencacahan. |
Contoh
SELECT orthogonal_Bitmap_union_count(user_id) FROM user_tag_Bitmap WHERE tag IN (1150000, 1150001, 390006);Selama eksekusi kueri, agregasi dilakukan dalam dua tahap. Pada tahap pertama, ApsaraDB for SelectDB menghitung gabungan nilai bitmap, kemudian menghitung hasil gabungan. Pada tahap kedua, ApsaraDB for SelectDB secara iteratif menghitung jumlah semua nilai hitungan yang diperoleh dari tahap pertama.
orthogonal_Bitmap_expr_calculate
Menghitung irisan, gabungan, dan selisih bitmap menggunakan ekspresi.
Sintaks
orthogonal_Bitmap_expr_calculate(Bitmap_column, filter_column, input_string)Parameter
Parameter | Deskripsi |
Bitmap_column | Nama kolom bitmap di mana gabungan nilai akan dihitung untuk pencacahan. |
filter_column | Kolom dimensi yang digunakan untuk penyaringan, yaitu kolom kunci untuk perhitungan. |
input_string | String ekspresi untuk menghitung irisan, gabungan, dan selisih bitmap berdasarkan kolom kunci. Kalkulator berikut didukung oleh ekspresi:
|
Contoh
SELECT orthogonal_Bitmap_expr_calculate(user_id, tag, '(833736|999777)&(1308083|231207)&(1000|20000-30000)') FROM user_tag_Bitmap WHERE tag IN (833736,999777,130808,231207,1000,20000,30000);Selama eksekusi kueri, agregasi dilakukan dalam dua tahap. Pada tahap pertama, ApsaraDB for SelectDB mengurai input_string untuk mendapatkan kondisi filter tag, kemudian menyaring data, dan akhirnya melakukan perhitungan bitmap pada data yang telah disaring berdasarkan input_string. Pada tahap kedua, ApsaraDB for SelectDB menghitung gabungan semua nilai bitmap yang diperoleh dari tahap pertama dan mengembalikan hasil bitmap akhir.
orthogonal_Bitmap_expr_calculate_count
Menghitung irisan, gabungan, dan selisih bitmap menggunakan ekspresi dan menghitung hasil perhitungan. Sintaks dan parameter sama dengan orthogonal_Bitmap_expr_calculate.
Sintaks
orthogonal_Bitmap_expr_calculate_count(Bitmap_column, filter_column, input_string)Parameter
Parameter | Deskripsi |
Bitmap_column | Nama kolom bitmap di mana gabungan nilai akan dihitung untuk pencacahan. |
filter_column | Kolom dimensi yang digunakan untuk penyaringan, yaitu kolom kunci untuk perhitungan. |
input_string | String ekspresi untuk menghitung irisan, gabungan, dan selisih bitmap berdasarkan kolom kunci. Kalkulator berikut didukung oleh ekspresi:
|
Contoh
SELECT orthogonal_Bitmap_expr_calculate_count(user_id, tag, '(833736|999777)&(1308083|231207)&(1000|20000-30000)') FROM user_tag_Bitmap WHERE tag IN (833736,999777,130808,231207,1000,20000,30000);Selama eksekusi kueri, agregasi dilakukan dalam dua tahap. Pada tahap pertama, ApsaraDB for SelectDB mengurai input_string untuk mendapatkan kondisi filter tag, kemudian menyaring data dan melakukan perhitungan bitmap pada data yang telah disaring berdasarkan input_string, dan akhirnya menghitung hasil perhitungan. Pada tahap kedua, ApsaraDB for SelectDB menghitung gabungan semua nilai bitmap yang diperoleh dari tahap pertama dan mengembalikan hasil bitmap akhir.