Topik ini menjelaskan cara menggunakan pernyataan SQL untuk mengakses tabel HBase.
Prasyarat
Versi LindormTable adalah 2.6.4 atau yang lebih baru. Untuk informasi lebih lanjut tentang cara melihat atau meningkatkan versi LindormTable, lihat Catatan rilis LindormTable dan Tingkatkan versi mesin minor dari instance Lindorm.
Informasi latar belakang
LindormTable memungkinkan Anda untuk langsung mengakses tabel yang dibuat dengan menggunakan HBase Shell atau ApsaraDB for HBase API for Java. Tabel HBase adalah tabel tanpa skema. Kolom dalam tabel HBase adalah kolom dinamis bertipe data VARBINARY, yang mewakili larik byte. Untuk informasi lebih lanjut tentang kolom dinamis, lihat Kolom Dinamis. ApsaraDB for HBase menyediakan fitur pemetaan kolom dan mendukung tipe data yang kompatibel dengan HBase untuk tabel HBase. Dengan cara ini, Anda dapat menggunakan pernyataan SQL Lindorm untuk kolom yang ditulis berdasarkan ApsaraDB for HBase API for Java dan menggunakan berbagai tipe data serta indeks sekunder.
Sintaksis
Dalam Lindorm SQL, Anda dapat menambahkan pemetaan untuk kualifikasi dalam keluarga kolom kustom di tabel HBase. Dengan cara ini, Anda dapat menggunakan pernyataan SQL untuk kueri selanjutnya.
Anda dapat menggunakan sintaksis berikut untuk menambahkan dan menghapus pemetaan:
dynamic_column_mapping_statement := ALTER TABLE table_name MAP DYNAMIC COLUMN
qualifer_definition hbase_type;
dynamic_column_unmapping_statement := ALTER TABLE table_name UNMAP DYNAMIC COLUMN
qualifer_definition_list;
qualifer_definition_list := qualifer_definition
(',' qualifer_definition)*
qualifer_definition := [ family_name ':' ] qualifier_name
hbase_type := HLONG | HINTEGER | HSHORT | HFLOAT |
HDOUBLE | HSTRING | HBOOLEANTabel berikut menjelaskan tipe data pemetaan yang dapat ditentukan oleh parameter hbase_type.
Tipe data | Tipe data Java | Deskripsi |
HLONG | java.lang.Long | Data ditulis ke kolom tabel HBase menggunakan fungsi Bytes.toBytes(long). |
HINTEGER | java.lang.Integer | Data ditulis ke kolom tabel HBase menggunakan fungsi Bytes.toBytes(int). |
HSHORT | java.lang.Short | Data ditulis ke kolom tabel HBase menggunakan fungsi Bytes.toBytes(short). |
HFLOAT | java.lang.Float | Data ditulis ke kolom tabel HBase menggunakan fungsi Bytes.toBytes(float). |
HDOUBLE | java.lang.Double | Data ditulis ke kolom tabel HBase menggunakan fungsi Bytes.toBytes(double). |
HSTRING | java.lang.String | Data ditulis ke kolom tabel HBase menggunakan fungsi Bytes.toBytes(String). |
HBOOLEAN | java.lang.Boolean | Data ditulis ke kolom tabel HBase menggunakan fungsi Bytes.toBytes(boolean). |
LindormTable versi 2.5.1 dan versi yang lebih baru mendukung pemetaan rowkeys. Untuk metode pemetaan rowkeys, lihat metode pemetaan kualifikasi. Saat memetakan rowkeys, pastikan bahwa rowkeys diapit menggunakan backticks (` `).
Dalam bahasa pemrograman lain, Anda dapat menggunakan metode toBytes dalam kelas Java org.apache.hadoop.hbase.util.Bytes untuk mengkodekan dan menulis data.
Dalam Java, fungsi Bytes.toBytes(String) menggunakan UTF-8 untuk pengkodean data. Dalam bahasa pemrograman lain, UTF-8 juga digunakan untuk pengkodean data saat Anda menggunakan metode toBytes untuk mengonversi string menjadi byte.
Persiapan data
Dalam topik ini, ApsaraDB for HBase API for Java digunakan untuk membuat tabel HBase contoh dan menulis data ke tabel tersebut. Untuk informasi lebih lanjut, lihat Gunakan ApsaraDB for HBase API for Java untuk mengembangkan aplikasi.
Untuk informasi lebih lanjut tentang cara membuat tabel HBase dan menulis data ke tabel tersebut menggunakan metode lain, lihat Gunakan Lindorm Shell untuk terhubung ke LindormTable.
// Buat tabel HBase contoh bernama dt dan tentukan f1 sebagai nama keluarga kolom.
try (Admin admin = connection.getAdmin()) {
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("dt"));
htd.addFamily(new HColumnDescriptor(Bytes.toBytes("f1")));
admin.createTable(htd);
}
// Tulis data ke tabel.
try (Table table = connection.getTable(TableName.valueOf("dt"))) {
byte[] rowkey = Bytes.toBytes("row1");
byte[] family = Bytes.toBytes("f1");
Put put = new Put(rowkey);
// Tulis data bertipe STRING dan tentukan name sebagai nama kolom.
String name = "Some one";
put.addColumn(family, Bytes.toBytes("name"), Bytes.toBytes(name));
// Tulis data bertipe INT dan tentukan age sebagai nama kolom.
int age = 25;
put.addColumn(family, Bytes.toBytes("age"), Bytes.toBytes(age));
// Tulis data bertipe LONG dan tentukan time sebagai nama kolom.
long timestamp = 1656675491000L;
put.addColumn(family, Bytes.toBytes("time"), Bytes.toBytes(timestamp));
// Tulis data bertipe SHORT dan tentukan buycode sebagai nama kolom.
short buycode = 123;
put.addColumn(family, Bytes.toBytes("buycode"), Bytes.toBytes(buycode));
// Tulis data bertipe FLOAT dan tentukan price sebagai nama kolom.
float price = 12.3f;
put.addColumn(family, Bytes.toBytes("price"), Bytes.toBytes(price));
// Tulis data bertipe DOUBLE dan tentukan price2 sebagai nama kolom.
double price2 = 12.33333;
put.addColumn(family, Bytes.toBytes("price2"), Bytes.toBytes(price2));
// Tulis data bertipe BOOLEAN dan tentukan isMale sebagai nama kolom.
boolean isMale = true;
put.addColumn(family, Bytes.toBytes("isMale"), Bytes.toBytes(isMale));
// Tulis nilai null untuk semua jenis data.
//put.addColumn(family, qualifier, null);
table.put(put);
}Prosedur
Contoh berikut menunjukkan cara membuat tabel HBase bernama dt dan menggunakan pernyataan SQL untuk mengakses tabel HBase.
Gunakan Lindorm-cli untuk terhubung dan menggunakan LindormTable. Untuk informasi lebih lanjut tentang cara terhubung dan menggunakan LindormTable, lihat Gunakan Lindorm-cli untuk terhubung dan menggunakan LindormTable.
CatatanJika Anda menggunakan pernyataan SQL untuk mengakses tabel HBase di ApsaraDB for HBase Performance-enhanced Edition, Anda harus mengubah format URL API untuk Java menjadi
jdbc:lindorm:table:url=http://API URL for Java, dan mengubah nomor port dari 30020 menjadi 30060. URL API untuk Java diperoleh di konsol ApsaraDB for HBase.Sebagai contoh, jika Anda memperoleh URL
ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020di konsol ApsaraDB for HBase, ubah URL tersebut menjadijdbc:lindorm:table:url=http://ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30060.Eksekusi pernyataan
ALTER TABLEuntuk menambahkan pemetaan untuk data yang ditulis ke kolom tabel dt.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;CatatanMenambahkan pemetaan kolom merujuk pada menentukan tipe data untuk kolom terlepas dari apakah akan menulis data ke kolom tersebut.
Sistem mengonversi byte kembali ke data asli berdasarkan skema. Anda harus menentukan tipe data yang benar dipetakan ke tipe data SQL dalam pernyataan Lindorm SQL.
Dalam contoh berikut, jika Anda menentukan HINTEGER sebagai tipe data untuk kolom bernama f:age2, sistem mungkin mengambil data yang salah dengan memanggil fungsi Bytes.toInt().
int age = 25; byte[] ageValue = Bytes.toBytes(age); put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age"), ageValue);//Tipe data untuk kolom bernama f:age adalah INT, dan dipetakan ke tipe data HINTEGER dalam pernyataan Lindorm SQL. String age2 = "25"; byte[] age2Value = Bytes.toBytes(age2); put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age2"), age2Value);//Tipe data untuk kolom bernama f:age2 adalah STRING, dan dipetakan ke tipe data HSTRING dalam pernyataan Lindorm SQL.Eksekusi pernyataan DESCRIBE untuk melihat pemetaan skema saat ini.
DESCRIBE dt;CatatanUntuk informasi lebih lanjut tentang sintaksis pernyataan DESCRIBE, lihat DESCRIBE/SHOW/USE.
Kueri data dalam tabel dt menggunakan pernyataan SQL berikut:
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;Opsional. Buat indeks sekunder.
Indeks sekunder digunakan untuk mengurangi waktu kueri data dengan biaya ruang penyimpanan. Indeks sekunder memungkinkan Anda mengkueri data berdasarkan kolom non-kunci utama. Ini meningkatkan efisiensi kueri tetapi memerlukan lebih banyak ruang penyimpanan. Untuk informasi lebih lanjut tentang batasan sintaksis pada indeks sekunder, lihat CREATE INDEX dan Indeks Sekunder.
Ubah atribut tabel utama bernama dt.
ALTER TABLE dt SET 'MUTABILITY' = 'MUTABLE_LATEST';CatatanJika Anda menggunakan timestamp kustom, Anda harus mengatur atribut tabel utama menjadi MUTABLE_ALL.
Buat indeks sekunder untuk tabel.
CREATE INDEX idx ON dt(f1:age) WITH (INDEX_COVERED_TYPE ='COVERED_DYNAMIC_COLUMNS');Opsional. Jika Anda menentukan parameter async saat membuat indeks sekunder dan versi LindormTable adalah lebih awal dari 2.6.3, bangun data historis dari tabel utama ke tabel indeks agar dapat mengkueri data historis menggunakan indeks sekunder. Lewati langkah ini jika Anda tidak menentukan parameter async saat membuat indeks sekunder.
BUILD INDEX idx ON dt;Lihat indeks.
SHOW INDEX FROM dt;Hasil sampel:
+---------------+----------- -+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+ | 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 | | +---------------+-------------+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+CatatanJika nilai INDEX_STATE dalam hasil yang dikembalikan adalah Active, indeks telah dibangun.
Nilai INDEX_PROGRESS dalam hasil yang dikembalikan menentukan kemajuan pembuatan indeks.
Opsional. Eksekusi pernyataan EXPLAIN untuk melihat rencana eksekusi. Anda dapat memeriksa apakah indeks sekunder tercapai.
EXPLAIN SELECT * FROM dt WHERE f1:age=23 LIMIT 1;
Opsional. Buat indeks pencarian.
Buat indeks pencarian.
CREATE INDEX search_idx USING SEARCH ON dt(f1:age,f1:name);CatatanJika Anda membuat indeks pencarian untuk tabel HBase dengan mengeksekusi pernyataan SQL, perhatikan batasan berikut pada kolom dalam indeks pencarian:
Semua kolom dalam indeks pencarian harus didefinisikan dalam pemetaan kolom yang dibuat untuk tabel.
Tipe data yang didukung oleh kolom dalam indeks pencarian harus sama dengan yang dapat ditentukan dalam pemetaan. Untuk informasi lebih lanjut, lihat Tipe Data dalam Pemetaan.
Pemetaan kolom yang dikonfigurasikan antara tabel HBase dan indeks pencarian tidak dapat dihapus. Jika tidak, hasil kueri yang salah akan dikembalikan.
Jika Anda menggunakan timestamp kustom untuk menulis data ke tabel HBase dan perlu membuat indeks pencarian, Anda harus mengatur atribut MUTABILITY tabel menjadi
MUTABLE_ALL.
Periksa apakah indeks dibuat.
SHOW INDEX FROM dt;Hasil sampel:
+--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+ | 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 | | +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+
Opsional. Hapus satu atau beberapa pemetaan kolom.
Hapus satu pemetaan kolom. Contoh kode:
ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:isMale;Hapus beberapa pemetaan kolom. Contoh kode:
ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:price2, f1:price2;