全部产品
Search
文档中心

Lindorm:Kolom dinamis

更新时间:Jul 02, 2025

LindormTable mendukung kolom dinamis. Dengan fitur ini, Anda dapat menulis dan menanyakan data dalam kolom yang tidak ditentukan secara eksplisit saat pembuatan tabel.Lindorm Dokumen ini menjelaskan cara menggunakan Lindorm SQL untuk mengaktifkan kolom dinamis serta cara menulis dan menanyakan data di dalamnya.

Informasi latar belakang

Skema tabel basis data relasional tradisional harus ditentukan sebelumnya. Penambahan kolom memerlukan modifikasi atribut tabel, yang pada tabel besar bisa memakan waktu lama. Skema yang telah ditentukan mungkin kurang fleksibel untuk kebutuhan bisnis. LindormTable menyediakan fitur kolom dinamis, sehingga Anda tidak perlu menentukan kolom terlebih dahulu. Anda dapat menggunakan Lindorm SQL untuk membaca dan menulis data ke kolom dinamis.

Catatan

Sebelum menggunakan fitur kolom dinamis, perhatikan hal-hal berikut:

  • Pastikan versi LindormTable adalah 2.2.19 atau lebih baru. Untuk informasi lebih lanjut, lihat Tingkatkan versi mesin minor dari instance Lindorm.Lindorm

  • Data dalam kolom dinamis di LindormTable bertipe VARBINARY. Anda harus mengonversi tipe data kolom dinamis menjadi larik byte ketika menulis atau menanyakan data.

  • Jika Anda menggunakan API HBase untuk Java untuk membuat tabel atau menulis data, Anda dapat menggunakan Lindorm SQL untuk menanyakan dan menulis data ke kolom dinamis dalam tabel tersebut.

Aktifkan kolom dinamis

Penting

Kolom dinamis tidak dapat dinonaktifkan setelah diaktifkan untuk sebuah tabel.

Anda dapat menggunakan salah satu metode berikut untuk mengaktifkan kolom dinamis:

  • Aktifkan kolom dinamis dengan menggunakan klausa WITH saat membuat tabel.

    CREATE TABLE t_dynamic (p1 INT, c1 INT, c2 VARCHAR, PRIMARY KEY(p1)) WITH (DYNAMIC_COLUMNS='true');
  • Modifikasi atribut tabel yang ada untuk mengaktifkan kolom dinamis.

    ALTER TABLE t_dynamic SET 'DYNAMIC_COLUMNS' = 'true';

    Verifikasi Hasil

    Eksekusi pernyataan berikut untuk memverifikasi apakah kolom dinamis diaktifkan untuk sebuah tabel:

    SHOW TABLE VARIABLES FROM t_dynamic LIKE 'DYNAMIC_COLUMNS';
    Catatan

    Setelah kolom dinamis diaktifkan, Anda dapat memodifikasi atribut tabel untuk menambahkan kolom baru ke skema tabel. Sebagai contoh, eksekusi pernyataan berikut untuk menambahkan kolom c3 dengan tipe data INT ke skema tabel.

    ALTER TABLE t_dynamic ADD COLUMN c3 int;

    Jika Anda menulis data ke kolom dinamis bernama c3 sebelum menambahkan kolom c3 ke skema tabel, pengecualian akan dikembalikan saat menyisipkan atau menanyakan data INT karena tipe data yang ditulis ke c3 adalah VARBINARY. Pengecualian ini tidak terjadi jika tipe data kolom c3 yang ditambahkan ke skema tabel adalah VARBINARY. Oleh karena itu, perhatikan tipe data saat mengubah skema tabel dengan kolom dinamis yang diaktifkan. Jangan atur nama kolom yang telah ditentukan sebagai nama kolom dinamis yang sudah ada.

Tulis data ke kolom dinamis

Tulis data langsung ke kolom dinamis menggunakan pernyataan SQL

Sintaks untuk menulis data ke tabel tetap tidak berubah meskipun kolom dinamis telah diaktifkan untuk sebuah tabel. Setelah mengaktifkan kolom dinamis, Anda dapat menulis data ke kolom yang tidak didefinisikan dalam skema tabel. Namun, tipe data pada kolom dinamis hanya dapat berupa VARBINARY, yang merepresentasikan larik byte. Anda dapat menggunakan pernyataan SQL di Lindorm-cli untuk menulis data ke kolom dinamis. Nilai yang ingin ditulis ke kolom dinamis melalui pernyataan UPSERT harus dikonversi menjadi string heksadesimal (hex string), yaitu representasi biner dalam bentuk karakter heksadesimal (0-9 dan A-F).

Catatan

Sebuah byte dapat direpresentasikan oleh angka desimal antara 0 dan 255, atau dua digit heksadesimal dari 0x00 hingga 0xFF. Untuk informasi lebih lanjut tentang konversi larik byte menjadi hex string, lihat Lampiran: Konversi Larik Byte Menjadi Hex String.

Berikut adalah contoh cara menulis data ke kolom dinamis:

  • Pernyataan berikut dieksekusi untuk menulis data ke kolom c3 dalam tabel t_dynamic. Kolom c3 adalah kolom dinamis. Operasi berhasil.

    UPSERT INTO t_dynamic (p1, c2, c3) VALUES (1, '1', '41');
  • Pernyataan berikut dieksekusi untuk menulis data ke kolom c4 dalam tabel t_dynamic. Kolom c4 adalah kolom dinamis. Operasi berhasil.

    UPSERT INTO t_dynamic (p1, c4) VALUES (2, 'ef0011');
  • Pada Lindorm SQL 2.6.8 dan versi yang lebih baru, Anda dapat menggunakan metode dalam pernyataan berikut untuk menentukan hex string, sehingga menghindari kebingungan antara string biasa dan hex string.

    UPSERT INTO t_dynamic(p1, c4) VALUES (3, x'ef0011');

    Dalam pernyataan di atas, data yang ditulis ke kolom dinamis c4 adalah tiga hex string berikut yang masing-masing satu byte panjangnya, bukan string ef0011 yang enam byte panjangnya: 0xEF, 0x00, dan 0x11.

    Catatan

    Untuk informasi lebih lanjut tentang cara melihat versi Lindorm SQL, lihat Versi SQL.

  • Pernyataan berikut dieksekusi untuk menulis data ke kolom c5 dalam tabel t_dynamic, yang merupakan kolom dinamis. Operasi penulisan gagal karena nilai yang ditulis ke kolom dinamis c5 adalah f, yang bukan hex string dengan panjang bilangan genap. Anda perlu mengubah nilai f menjadi 0f.

    UPSERT INTO t_dynamic (p1, c5) VALUES (4, 'f');
  • Pernyataan berikut dieksekusi untuk menulis data ke kolom c6 dalam tabel t_dynamic. Kolom c6 merupakan kolom dinamis. Operasi gagal dan mengembalikan kesalahan karena nilai yang ditulis ke c6 adalah gf, yang bukan merupakan hex string.

    UPSERT INTO t_dynamic (p1, c6) VALUES (5, x'gf');

Tulis data ke kolom dinamis dengan menentukan parameter dalam pernyataan SQL (direkomendasikan)

Kami merekomendasikan menulis larik byte ke kolom dinamis dengan menentukan larik byte sebagai parameter dalam pernyataan SQL di aplikasi Anda. Jika ingin menulis string atau nilai numerik, Anda harus mengkodekannya menjadi larik byte terlebih dahulu.

Kode Java berikut memberikan contoh cara menulis data ke kolom dinamis tabel t_dynamic dengan menentukan data sebagai parameter:

Connection conn = DriverManager.getConnection(lindorm-jdbc-url);
String createTable = "CREATE TABLE testTable (p1 VARCHAR, c1 INT, PRIMARY KEY(p1)) 'DYNAMIC_COLUMNS' = 'true'";
Statement statement = conn.createStatement();
statement.execute(createTable);

// Masukkan tiga kolom p1, c1, dan c2 ke dalam tabel. Kolom p1 dan c1 didefinisikan dalam skema tabel. Kolom c2 tidak didefinisikan dan dimasukkan ke dalam tabel sebagai kolom dinamis. 
String sqlUpsert = "upsert into " + tableName + "(p1, c1, c2) values(?, ?, ?)";
try (PreparedStatement stmt = conn.prepareStatement(sqlUpsert)) {
    stmt.setString(1, "pk");
    stmt.setInt(2, 4);
    stmt.setBytes(3, new byte[] {0,1});
    int updated = stmt.executeUpdate();
    Assert.assertEquals(1, updated);
}
Penting

Anda dapat memasukkan hex string sebagai parameter untuk menulis data, mirip dengan metode PreparedStatement#setString() dari JDBC. Namun, kami tidak merekomendasikan metode ini, terutama saat menggunakan MySQL untuk berinteraksi dengan Lindorm, karena dapat menyebabkan ambiguitas data.

Tanyakan data dalam kolom dinamis

Skenario untuk menanyakan data dalam kolom dinamis diklasifikasikan sebagai berikut:

  • Bidang yang ingin ditanyakan adalah kolom dinamis yang didefinisikan secara eksplisit. Sintaks untuk menanyakan data dalam tabel dengan kolom dinamis sama dengan sintaks untuk tabel tanpa kolom dinamis. Setelah kolom dinamis diaktifkan, Anda dapat menanyakan data dalam kolom yang tidak didefinisikan dalam skema tabel.

    SELECT p1, c2, c3, c4 FROM t_dynamic WHERE p1 = 1;

    Hasil berikut dikembalikan:

    +----+----+------+------+
    | p1 | c2 |  c3  |  c4  |
    +----+----+------+------+
    | 1  | 1  | 0x41 | null |
    +----+----+------+------+
  • Untuk melihat kolom dinamis dalam sebuah tabel, gunakan pernyataan SELECT * dengan klausa LIMIT untuk membatasi ukuran set hasil.

    SELECT * FROM t_dynamic LIMIT 10;

    Hasil berikut dikembalikan:

    +----+------+------+------+----------+
    | p1 |  c1  |  c2  |  c3  |    c4    |
    +----+------+------+------+----------+
    | 1  | null | 1    | 0x41 | null     |
    | 2  | null | null | null | 0xef0011 |
    | 3  | null | null | null | 0xef0011 |
    +----+------+------+------+----------+
    Penting

    Jika Anda menggunakan pernyataan SELECT * dengan klausa LIMIT untuk menanyakan data dalam tabel yang memiliki kolom dinamis diaktifkan, nilai maksimum default LIMIT adalah 5.000. Anda dapat menentukan nilai maksimum sendiri. Jika nilai yang diminta melebihi batas maksimum, sistem akan mengembalikan kesalahan.

  • Kolom dinamis digunakan dalam kondisi WHERE.

    Untuk memastikan kinerja kueri, sertakan kolom kunci utama atau kolom kunci indeks dalam kondisi WHERE. Nilai dalam kolom dinamis dalam kondisi WHERE harus berupa hex string.

    Contohnya, jika kolom c4 dalam tabel t_dynamic adalah kolom dinamis, pernyataan berikut dapat dieksekusi untuk kueri yang berhasil:

    SELECT p1, c4 FROM t_dynamic WHERE p1 = 3 AND c4 = x'ef0011';

    Sebaliknya, kueri berikut gagal karena nilai 1 dari kolom c4 dalam kondisi WHERE bukan hex string.

    SELECT p1, c1, c4 FROM t_dynamic WHERE p1 = 2 AND c4 = '1';

Tampilkan data dalam kolom dinamis

Hasil kueri untuk kolom dinamis ditampilkan berbeda berdasarkan alat baris perintah yang digunakan untuk terhubung ke Lindorm.

Lindorm-cli

HexString

Jika menggunakan Lindorm-cli, hasil kueri ditampilkan sebagai hex string. Contohnya, pernyataan berikut dieksekusi untuk menanyakan data dalam tabel t_dynamic:

SELECT p1, c3, c4 FROM t_dynamic WHERE p1 = 1;

Hasil berikut dikembalikan:

+----+------+------+------+----------+
| p1 |  c1  |  c2  |  c3  |    c4    |
+----+------+------+------+----------+
| 1  | null | 1    | 0x41 | null     |
| 2  | null | null | null | 0xef0011 |
| 3  | null | null | null | 0xef0011 |
+----+------+------+------+----------+

Dalam set hasil, nilai pada baris pertama kolom dinamis c3 ditampilkan sebagai hex string 0x41, yang menunjukkan huruf A.

String

Jika ingin hasil kueri dalam format string biasa, tambahkan parameter -bytesOutputAsString di akhir perintah Lindorm-cli:

./lindorm-cli -url <jdbc url> -username <Nama Pengguna> -password <Kata Sandi> -bytesOutputAsString
Catatan

Untuk informasi lebih lanjut tentang parameter koneksi Lindorm-cli, lihat Langkah 2: Terhubung ke LindormTable.

Eksekusi pernyataan SQL yang sama seperti pada contoh sebelumnya mengembalikan hasil berikut:

+-----+-------+---------+
| p1  |   c3  |   c4    |
+-----+-------+---------+
|  1  | A     |  null   |
+-----+-------+---------+

Alat baris perintah MySQL

Secara default, data dalam kolom dinamis ditampilkan sebagai tanda tanya (?) dalam alat baris perintah MySQL.

Lampiran: Konversi larik byte menjadi hex string

Kode Java berikut memberikan contoh cara mengonversi larik byte menjadi hex string:

private static final char[] DIGITS = {
  '0', '1', '2', '3', '4', '5', '6', '7',
  '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
  };

private static String toHexString(byte[] bytes) {
  char[] chars;
  int j = 0;
  chars = new char[bytes.length * 2];
  for (byte b : bytes) {
    chars[j++] = DIGITS[(b & 0xF0) >> 4];
    chars[j++] = DIGITS[b & 0x0F];
  }
  return new String(chars, 0, j);
}

public void testToHexString() {
  String s = "Hello, world";
  // Anda dapat menggunakan metode getBytes() dari string untuk mendapatkan larik byte yang sesuai dengan string.
  byte[] bytes = s.getBytes(Charset.forName("UTF-8"));
  String hexString = toHexString(bytes);
  System.out.println(hexString); // Outputnya adalah 48656c6c6f2c20776f726c64.
}