All Products
Search
Document Center

Lindorm:Gunakan SQL untuk mengakses tabel HBase

Last Updated:Mar 28, 2026

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:

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

TypeJava typeWrite functionKapan digunakan
HLONGjava.lang.LongBytes.toBytes(long)Data ditulis sebagai Java long
HINTEGERjava.lang.IntegerBytes.toBytes(int)Data ditulis sebagai Java int
HSHORTjava.lang.ShortBytes.toBytes(short)Data ditulis sebagai Java short
HFLOATjava.lang.FloatBytes.toBytes(float)Data ditulis sebagai Java float
HDOUBLEjava.lang.DoubleBytes.toBytes(double)Data ditulis sebagai Java double
HSTRINGjava.lang.StringBytes.toBytes(String) — UTF-8Data ditulis sebagai Java String
HBOOLEANjava.lang.BooleanBytes.toBytes(boolean)Data ditulis sebagai Java boolean
Penting

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 toBytes dari org.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 HSTRING

Mencampur 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

  1. 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:30020 menjadi jdbc:lindorm:table:url=http://ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30060.
  2. 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;
  3. Verifikasi pemetaan dengan menjalankan DESCRIBE:

    DESCRIBE dt;

    Untuk informasi lebih lanjut tentang sintaks DESCRIBE, lihat DESCRIBE/SHOW/USE.

  4. 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 indeksPaling cocok untukTrade-off
Secondary indexKueri pada kolom non-primary-key dengan volume write standarPembacaan lebih cepat, penyimpanan lebih besar, overhead write sedikit
Search indexPencarian teks penuh atau kueri multi-kondisi kompleksKueri fleksibel, biaya penyimpanan lebih tinggi

Buat indeks secondary

  1. Atur atribut MUTABILITY tabel:

    Jika Anda menulis data dengan timestamp kustom, gunakan MUTABLE_ALL alih-alih MUTABLE_LATEST.
    ALTER TABLE dt SET 'MUTABILITY' = 'MUTABLE_LATEST';
  2. Buat indeks:

    CREATE INDEX idx ON dt(f1:age) WITH (INDEX_COVERED_TYPE ='COVERED_DYNAMIC_COLUMNS');
  3. 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.

  4. 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_STATE bernilai ACTIVE. INDEX_PROGRESS menunjukkan progres pembuatan.

  5. (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

  1. 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 MUTABILITY ke MUTABLE_ALL sebelum membuat indeks.

  2. 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;

Langkah selanjutnya