LindormTable memungkinkan Anda menjalankan kueri terhadap tabel HBase yang sudah ada menggunakan SQL—tanpa mengubah cara penulisan data. Petakan kualifikasi kolom ke kolom SQL bertipe, lalu jalankan kueri SELECT serta buat indeks secondary atau indeks pencarian.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
LindormTable versi 2.6.4 atau lebih baru. Untuk memeriksa atau melakukan upgrade versi, lihat Release notes of LindormTable dan Upgrade the minor engine version of a Lindorm instance.
Cara kerja pemetaan kolom
Tabel HBase tidak memiliki skema (schema-free). Kolom menyimpan byte mentah (VARBINARY), dan nama kolom bersifat dinamis. Fitur pemetaan kolom LindormTable menjembatani perbedaan ini: deklarasikan tipe serialisasi Java yang digunakan saat menulis setiap kualifikasi, sehingga Lindorm SQL dapat mendekode byte tersebut dan mengekspos kolom sebagai kolom SQL bertipe—memungkinkan penggunaan filter WHERE, indeks secondary, dan indeks pencarian pada data HBase.
Untuk informasi lebih lanjut tentang kolom dinamis, lihat Dynamic columns.
Sintaks pemetaan kolom
Gunakan ALTER TABLE untuk menambahkan atau menghapus pemetaan kolom:
-- Tambahkan pemetaan
ALTER TABLE <table_name> MAP DYNAMIC COLUMN [<family>:]<qualifier> <hbase_type>;
-- Hapus satu atau beberapa pemetaan
ALTER TABLE <table_name> UNMAP DYNAMIC COLUMN [<family>:]<qualifier> [, ...];Nilai hbase_type yang didukung
| Type | Java type | Write function | Kapan digunakan |
|---|---|---|---|
| HLONG | java.lang.Long | Bytes.toBytes(long) | Data ditulis sebagai Java long |
| HINTEGER | java.lang.Integer | Bytes.toBytes(int) | Data ditulis sebagai Java int |
| HSHORT | java.lang.Short | Bytes.toBytes(short) | Data ditulis sebagai Java short |
| HFLOAT | java.lang.Float | Bytes.toBytes(float) | Data ditulis sebagai Java float |
| HDOUBLE | java.lang.Double | Bytes.toBytes(double) | Data ditulis sebagai Java double |
| HSTRING | java.lang.String | Bytes.toBytes(String) — UTF-8 | Data ditulis sebagai Java String |
| HBOOLEAN | java.lang.Boolean | Bytes.toBytes(boolean) | Data ditulis sebagai Java boolean |
Tipe pemetaan harus persis sesuai dengan metode serialisasi Java yang digunakan saat penulisan. Ketidaksesuaian menyebabkan Lindorm SQL membaca byte yang salah dan mengembalikan hasil yang tidak benar. Lihat Kesalahan umum di bawah ini.
Catatan penggunaan
Menambahkan pemetaan hanya mendeklarasikan tipe untuk suatu kolom—tidak mensyaratkan data sudah ada di kolom tersebut.
Pemetaan rowkey didukung pada LindormTable 2.5.1 dan versi lebih baru. Sertakan identifier rowkey dalam backtick: `
ROW`.Pada bahasa selain Java, gunakan metode
toBytesdariorg.apache.hadoop.hbase.util.Bytes. String selalu dikodekan sebagai UTF-8.
Kesalahan umum
Tipe pemetaan tidak sesuai dengan jalur penulisan
Ini merupakan risiko ketidakakuratan paling kritis. Jika kolom f:age ditulis dengan Bytes.toBytes(int), petakan sebagai HINTEGER. Jika Anda memetakannya sebagai HSTRING, Lindorm SQL akan memanggil Bytes.toString() pada 4 byte integer mentah dan mengembalikan data sampah.
Contoh pemetaan yang benar:
int age = 25;
put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age"), Bytes.toBytes(age));
// Petakan sebagai HINTEGER
String age2 = "25";
put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age2"), Bytes.toBytes(age2));
// Petakan sebagai HSTRINGMencampur kedua hal ini merupakan sumber paling umum dari hasil kueri yang salah.
Siapkan data sampel
Langkah-langkah berikut menggunakan tabel dan data HBase berikut. Jika Anda sudah memiliki tabel HBase, lewati ke bagian Petakan kualifikasi kolom.
Contoh ini membuat tabel bernama dt dengan keluarga kolom f1 dan menulis satu baris menggunakan ApsaraDB for HBase API for Java. Untuk menggunakan HBase Shell sebagai gantinya, lihat Use Lindorm Shell to connect to LindormTable.
// Buat tabel dt dengan keluarga kolom f1
try (Admin admin = connection.getAdmin()) {
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("dt"));
htd.addFamily(new HColumnDescriptor(Bytes.toBytes("f1")));
admin.createTable(htd);
}
// Tulis satu baris
try (Table table = connection.getTable(TableName.valueOf("dt"))) {
byte[] rowkey = Bytes.toBytes("row1");
byte[] family = Bytes.toBytes("f1");
Put put = new Put(rowkey);
String name = "Some one";
put.addColumn(family, Bytes.toBytes("name"), Bytes.toBytes(name)); // HSTRING
int age = 25;
put.addColumn(family, Bytes.toBytes("age"), Bytes.toBytes(age)); // HINTEGER
long timestamp = 1656675491000L;
put.addColumn(family, Bytes.toBytes("time"), Bytes.toBytes(timestamp)); // HLONG
short buycode = 123;
put.addColumn(family, Bytes.toBytes("buycode"), Bytes.toBytes(buycode)); // HSHORT
float price = 12.3f;
put.addColumn(family, Bytes.toBytes("price"), Bytes.toBytes(price)); // HFLOAT
double price2 = 12.33333;
put.addColumn(family, Bytes.toBytes("price2"), Bytes.toBytes(price2)); // HDOUBLE
boolean isMale = true;
put.addColumn(family, Bytes.toBytes("isMale"), Bytes.toBytes(isMale)); // HBOOLEAN
table.put(put);
}Petakan kualifikasi kolom
Hubungkan ke LindormTable menggunakan Lindorm-cli. Untuk instruksi, lihat Use Lindorm-cli to connect to and use LindormTable.
Jika Anda mengakses tabel HBase di ApsaraDB for HBase Performance-enhanced Edition, ubah format URL API Java menjadi
jdbc:lindorm:table:url=http://<API URL for Java>dan ubah port dari 30020 menjadi 30060. Misalnya,ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020menjadijdbc:lindorm:table:url=http://ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30060.Petakan rowkey dan semua kualifikasi ke tipe Lindorm SQL yang sesuai:
ALTER TABLE dt MAP DYNAMIC COLUMN `ROW` HSTRING, f1:name HSTRING, f1:age HINTEGER, f1:time HLONG, f1:buycode HSHORT, f1:price HFLOAT, f1:price2 HDOUBLE, f1:isMale HBOOLEAN;Verifikasi pemetaan dengan menjalankan DESCRIBE:
DESCRIBE dt;Untuk informasi lebih lanjut tentang sintaks DESCRIBE, lihat DESCRIBE/SHOW/USE.
Jalankan kueri terhadap tabel:
SELECT * FROM dt LIMIT 1; SELECT * FROM dt WHERE f1:isMale=true LIMIT 1; SELECT * FROM dt WHERE f1:name='Some one' LIMIT 1; SELECT * FROM dt WHERE f1:time>1656675490000 AND f1:time<1656675492000 LIMIT 1;
Buat indeks (opsional)
Menambahkan indeks meningkatkan performa kueri tetapi memerlukan penyimpanan tambahan. Pilih jenis indeks berdasarkan pola kueri Anda:
| Jenis indeks | Paling cocok untuk | Trade-off |
|---|---|---|
| Secondary index | Kueri pada kolom non-primary-key dengan volume write standar | Pembacaan lebih cepat, penyimpanan lebih besar, overhead write sedikit |
| Search index | Pencarian teks penuh atau kueri multi-kondisi kompleks | Kueri fleksibel, biaya penyimpanan lebih tinggi |
Buat indeks secondary
Atur atribut MUTABILITY tabel:
Jika Anda menulis data dengan timestamp kustom, gunakan
MUTABLE_ALLalih-alihMUTABLE_LATEST.ALTER TABLE dt SET 'MUTABILITY' = 'MUTABLE_LATEST';Buat indeks:
CREATE INDEX idx ON dt(f1:age) WITH (INDEX_COVERED_TYPE ='COVERED_DYNAMIC_COLUMNS');Jika Anda menentukan parameter `async` dan versi LindormTable Anda sebelum 2.6.3, bangun data historis ke dalam tabel indeks:
BUILD INDEX idx ON dt;Lewati langkah ini jika Anda tidak menggunakan
async.Verifikasi indeks:
SHOW INDEX FROM dt;Output yang diharapkan:
+---------------+-------------+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+ | TABLE_SCHEMA | DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_PROGRESS | INDEX_TYPE | INDEX_COVERED | INDEX_COLUMN | INDEX_TTL | +---------------+-------------+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+ | default | dt | idx | ACTIVE | 100% | SECONDARY | TRUE | f1:age,ROW | | +---------------+-------------+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+Indeks siap digunakan saat
INDEX_STATEbernilaiACTIVE.INDEX_PROGRESSmenunjukkan progres pembuatan.(Opsional) Periksa apakah indeks secondary digunakan dalam kueri:
EXPLAIN SELECT * FROM dt WHERE f1:age=23 LIMIT 1;Untuk informasi lebih lanjut, lihat CREATE INDEX dan Secondary indexes.
Buat indeks pencarian
Buat indeks pencarian:
CREATE INDEX search_idx USING SEARCH ON dt(f1:age, f1:name);Sebelum membuat indeks pencarian pada tabel HBase, perhatikan hal berikut:
Semua kolom dalam indeks pencarian harus sudah memiliki pemetaan kolom yang didefinisikan.
Tipe data kolom harus sesuai dengan tipe pemetaan yang didukung seperti yang tercantum di Sintaks pemetaan kolom.
Jangan hapus pemetaan kolom setelah membuat indeks pencarian—hal ini menyebabkan hasil kueri yang salah.
Jika Anda menulis data dengan timestamp kustom, atur
MUTABILITYkeMUTABLE_ALLsebelum membuat indeks.
Periksa status indeks:
SHOW INDEX FROM dt;Output yang diharapkan:
+--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+ | TABLE_SCHEMA | DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_PROGRESS | INDEX_TYPE | INDEX_COVERED | INDEX_COLUMN | INDEX_TTL | INDEX_DESCRIPTION | +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+ | default | dt | idx | ACTIVE | DONE | SECONDARY | DYNAMIC | f1:age,ROW | | | | default | dt | search_idx | BUILDING | N/A | SEARCH | NA | f1:age,f1:name | 0 | | +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+
Hapus pemetaan kolom (opsional)
Hapus satu pemetaan:
ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:isMale;Hapus beberapa pemetaan dalam satu pernyataan:
ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:price, f1:price2;