All Products
Search
Document Center

ApsaraDB for HBase:Akses tabel HBase menggunakan SQL

Last Updated:Aug 27, 2026

LindormTable memungkinkan Anda menjalankan kueri SQL langsung pada tabel HBase yang dibuat melalui HBase Shell atau ApsaraDB for HBase API untuk Java—tanpa perlu migrasi data. Pemetaan kolom menjembatani model penyimpanan HBase yang bebas skema dan Lindorm SQL, sehingga Anda dapat menyaring, mengindeks, serta mengkueri data yang sudah ada menggunakan sintaksis SQL standar.

Prasyarat

Versi mesin tabel lebar adalah 2.6.4 atau lebih baru. Untuk informasi tentang cara melihat atau melakukan upgrade versi saat ini, lihat Catatan rilis LindormTable dan Upgrade versi mesin minor instans Lindorm.

Informasi latar belakang

Mesin tabel lebar Lindorm dapat langsung mengakses tabel data yang dibuat menggunakan Lindorm Shell atau HBase Java API. Namun, karena HBase bersifat bebas skema, kolom-kolom dalam HBase diperlakukan sebagai kolom dinamis dengan tipe VARBINARY (Byte). Untuk informasi lebih lanjut tentang kolom dinamis, lihat Kolom dinamis. Untuk menggunakan Lindorm SQL pada kolom yang ditulis melalui HBase API serta memanfaatkan tipe data kaya dan indeks sekunder, ApsaraDB for HBase menyediakan pemetaan kolom HBase dan tipe yang kompatibel dengan HBase.

Sintaksis

Dalam Lindorm SQL, Anda dapat menambahkan pemetaan ke kualifikasi dalam family kolom kustom tabel HBase untuk memudahkan kueri SQL.

Sintaksis untuk menambahkan dan menghapus pemetaan adalah sebagai berikut:

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 | HBOOLEAN

Tabel berikut menjelaskan tipe data pemetaan yang dapat ditentukan oleh hbase_type:

Tipe data

Tipe Java yang sesuai

Deskripsi

HLONG

java.lang.Long

Menulis kolom HBase menggunakan metode Bytes.toBytes(long).

HINTEGER

java.lang.Integer

Menulis kolom HBase menggunakan metode Bytes.toBytes(int).

HSHORT

java.lang.Short

Menulis kolom HBase menggunakan metode Bytes.toBytes(short).

HFLOAT

java.lang.Float

Menulis kolom HBase menggunakan metode Bytes.toBytes(float).

HDOUBLE

java.lang.Double

Menulis kolom HBase menggunakan metode Bytes.toBytes(double).

HSTRING

java.lang.String

Menulis kolom HBase menggunakan metode Bytes.toBytes(String).

HBOOLEAN

java.lang.Boolean

Menulis kolom HBase menggunakan metode Bytes.toBytes(boolean).

Catatan
  • Mesin tabel lebar versi 2.5.1 atau lebih baru mendukung pemetaan untuk Rowkey. Metode pemetaannya sama seperti untuk kualifikasi lainnya. Objek pemetaan harus berupa ROW dan kata kunci ROW harus diapit dengan backtick (``).

  • Jika Anda menggunakan bahasa pemrograman lain, rujuk metode toBytes di kelas Java org.apache.hadoop.hbase.util.Bytes untuk mengencode data sebelum menulis.

  • Bytes.toBytes(String) dalam Java menggunakan encoding UTF-8. Saat Anda menggunakan toBytes untuk mengonversi String ke Bytes dalam bahasa lain, encoding UTF-8 juga wajib digunakan.

Persiapan data

Contoh berikut menggunakan HBase Java API. Untuk informasi lebih lanjut, lihat Gunakan ApsaraDB for HBase API untuk Java untuk mengembangkan aplikasi.

Catatan

Untuk metode lain dalam membuat tabel dan menulis data, lihat Hubungkan ke LindormTable dengan Lindorm Shell.

// Buat tabel contoh HBase bernama "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 data
try (Table table = connection.getTable(TableName.valueOf("dt"))) {
    byte[] rowkey = Bytes.toBytes("row1");
    byte[] family = Bytes.toBytes("f1");
    Put put = new Put(rowkey);
    // Tulis nilai String, nama kolom "name"
    String name = "Some one";
    put.addColumn(family, Bytes.toBytes("name"), Bytes.toBytes(name));
    // Tulis nilai Int, nama kolom "age"
    int age = 25;
    put.addColumn(family, Bytes.toBytes("age"), Bytes.toBytes(age));
    // Tulis nilai Long, nama kolom "time"
    long timestamp = 1656675491000L;
    put.addColumn(family, Bytes.toBytes("time"), Bytes.toBytes(timestamp));
    // Tulis nilai Short, nama kolom "buycode"
    short buycode = 123;
    put.addColumn(family, Bytes.toBytes("buycode"), Bytes.toBytes(buycode));
    // Tulis nilai Float, nama kolom "price"
    float price = 12.3f;
    put.addColumn(family, Bytes.toBytes("price"), Bytes.toBytes(price));
    // Tulis nilai Double, nama kolom "price2"
    double price2 = 12.33333;
    put.addColumn(family, Bytes.toBytes("price2"), Bytes.toBytes(price2));
    // Tulis nilai Boolean, nama kolom "isMale"
    boolean isMale = true;
    put.addColumn(family, Bytes.toBytes("isMale"), Bytes.toBytes(isMale));

    // Tulis nilai null. Untuk semua tipe, penulisan null dinyatakan sebagai:
    //put.addColumn(family, qualifier, null);

    table.put(put);
    }

Prosedur

Contoh berikut menggunakan tabel contoh dt untuk menjelaskan cara mengakses tabel HBase menggunakan SQL.

  1. Hubungkan ke mesin tabel lebar menggunakan Lindorm-cli. Untuk informasi lebih lanjut, lihat Hubungkan ke dan gunakan mesin tabel lebar dengan Lindorm-cli.

    Catatan

    Jika Anda menggunakan SQL untuk mengakses tabel HBase di ApsaraDB for HBase Enhanced Edition, ubah alamat yang diperoleh di Konsol ke format jdbc:lindorm:table:url=http://alamat Java API yang diperoleh di Konsol. Ubah port dari 30020 menjadi 30060.

    Sebagai contoh, jika alamat string koneksi yang diperoleh di Konsol adalah ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020, maka alamat string koneksi yang dikonversi adalah jdbc:lindorm:table:url=http://ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30060.

  2. Gunakan pernyataan ALTER TABLE untuk menambahkan pemetaan kolom ke data yang ditulis ke 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;
    Catatan
    • Menambahkan pemetaan kolom menentukan tipe data kolom tersebut, terlepas dari apakah data telah ditulis atau belum.

    • Sistem mendekode nilai asli dari Bytes berdasarkan skema. Oleh karena itu, Anda harus menggunakan tipe data yang benar saat memetakan ke Lindorm SQL.

    Pada contoh berikut, jika Anda menentukan tipe data kolom f:age2 sebagai HINTEGER, sistem akan memanggil metode Bytes.toInt() dan mengembalikan nilai asli yang salah.

    int age = 25;
    byte[] ageValue = Bytes.toBytes(age);
    put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age"), ageValue);// Tipe data kolom f:age adalah INT, dan dipetakan ke HINTEGER di Lindorm SQL.
    String age2 = "25";
    byte[] age2Value = Bytes.toBytes(age2);
    put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age2"), age2Value);// Tipe data kolom f:age2 adalah STRING, dan dipetakan ke HSTRING di Lindorm SQL.
  3. Gunakan pernyataan DESCRIBE untuk melihat hubungan pemetaan skema saat ini.

    DESCRIBE dt;
    Catatan

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

  4. Kueri data dalam tabel dt menggunakan pernyataan SQL.

    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;
  5. (Opsi) Buat indeks sekunder.

    Indeks sekunder menukar ruang penyimpanan dengan waktu eksekusi. Indeks ini meningkatkan efisiensi kueri untuk pola kueri non-primary-key tetapi memakan sebagian storage space. Untuk informasi lebih lanjut tentang sintaksis dan batasan penggunaan indeks sekunder, lihat CREATE INDEX dan Indeks sekunder.

    1. Ubah properti tabel utama dt.

      ALTER TABLE dt SET 'MUTABILITY' = 'MUTABLE_LATEST';
      Catatan

      Jika Anda menggunakan timestamp kustom, atur properti tabel utama ke MUTABLE_ALL.

    2. Buat indeks sekunder:

      CREATE INDEX idx ON dt(f1:age) WITH (INDEX_COVERED_TYPE ='COVERED_DYNAMIC_COLUMNS');
    3. Opsi: Jika versi mesin tabel lebar Anda lebih lama dari 2.6.3 dan Anda menggunakan parameter async (pembuatan indeks asinkron) saat membuat indeks sekunder, bangun secara manual data historis di tabel utama ke tabel indeks. Setelah pembangunan selesai, Anda dapat mengkueri data historis menggunakan indeks sekunder. Jika parameter async tidak digunakan saat pembuatan, Anda dapat melewati langkah ini.

      BUILD INDEX idx ON dt;
    4. Lihat indeks.

      SHOW INDEX FROM dt;

      Hasilnya:

      +---------------+----------- -+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+
      | 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    |             |
      +---------------+-------------+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+
      Catatan
      • Ketika INDEX_STATE pada nilai kembali berstatus Active, pembangunan data telah selesai.

      • INDEX_PROGRESS pada nilai kembali menunjukkan progres pembangunan indeks.

    5. Opsi: Gunakan pernyataan EXPLAIN untuk melihat rencana eksekusi dan memeriksa apakah indeks sekunder digunakan.

      EXPLAIN SELECT * FROM dt WHERE f1:age=23 LIMIT 1;
  6. Opsi: Buat indeks pencarian.

    1. Buat indeks pencarian.

      CREATE INDEX search_idx USING SEARCH ON dt(f1:age,f1:name);
      Catatan

      Jika Anda membuat indeks pencarian pada tabel HBase menggunakan SQL, perhatikan batasan berikut untuk setiap kolom indeks pencarian:

      • Semua kolom indeks pencarian harus didefinisikan dalam pemetaan kolom.

      • Tipe data yang didukung konsisten dengan tipe data yang dapat dipetakan. Untuk informasi lebih lanjut, lihat Tipe data pemetaan.

      • Anda tidak dapat menghapus pemetaan kolom indeks pencarian. Jika dilakukan, hasil kueri akan salah.

      • Jika Anda menggunakan timestamp kustom untuk menulis ke tabel HBase dan perlu membuat indeks pencarian, Anda harus mengatur properti MUTABILITY tabel ke MUTABLE_ALL.

    2. Periksa apakah indeks berhasil dibuat.

      SHOW INDEX FROM dt;

      Hasilnya:

      +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+
      | 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         |                   |
      +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+
  7. Opsi: Hapus pemetaan kolom.

    • Hapus pemetaan satu kolom. Berikut contohnya:

      ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:isMale;
    • Hapus beberapa pemetaan kolom. Berikut contohnya:

      ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:price2, f1:price2;