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
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
WITHsaat 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';CatatanSetelah 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
c3sebelum 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).
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
c4adalah tiga hex string berikut yang masing-masing satu byte panjangnya, bukan stringef0011yang enam byte panjangnya:0xEF,0x00, dan0x11.CatatanUntuk 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 adalahf, yang bukan hex string dengan panjang bilangan genap. Anda perlu mengubah nilaifmenjadi0f.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 adalahgf, 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);
}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 klausaLIMITuntuk 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 | +----+------+------+------+----------+PentingJika 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
c4dalam tabelt_dynamicadalah 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
1dari 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> -bytesOutputAsStringUntuk 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.
}