Kudu connector memungkinkan Anda melakukan kueri, menyisipkan, dan menghapus data yang disimpan dalam tabel Apache Kudu.
Informasi latar belakang
Kudu connector mencakup topik-topik berikut:
Prasyarat
Kluster Trino dan kluster Hadoop dengan layanan Kudu telah dibuat. Untuk informasi selengkapnya, lihat Buat kluster.
Batasan
-
Kudu 1.10 atau versi yang lebih baru.
-
Konektivitas jaringan antara kluster Trino dan Hadoop.
-
Nama tabel dan kolom Kudu harus menggunakan huruf kecil.
Modifikasi konfigurasi Kudu connector
Untuk informasi selengkapnya, lihat Konfigurasikan connector.
Di Konsol E-MapReduce (EMR), buka halaman Configure layanan Trino. Di area Service Configuration, klik tab kudu.properties.
|
Parameter |
Deskripsi |
|
kudu.client.master-addresses |
Daftar alamat master Kudu yang dipisahkan koma. Format yang didukung meliputi: example.com, example.com:7051, 192.0.2.1, 192.0.2.1:7051, [2001:db8::1], [2001:db8::1]:7051, dan 2001:db8::1. Nilai default: localhost. Catatan
Untuk menulis data ke dan melakukan kueri data dari tabel Kudu, ubah nilai default dari localhost menjadi alamat IP atau hostname node master Kudu, misalnya master-1-1. |
|
kudu.schema-emulation.enabled |
Apakah akan mengaktifkan emulasi skema.
Penting
Untuk menambahkan item ini, klik Add Configuration Item pada tab kudu.properties. Untuk petunjuknya, lihat Tambah item konfigurasi. |
|
kudu.schema-emulation.prefix |
Awalan untuk emulasi skema. Penting
Item konfigurasi ini wajib ditentukan ketika Awalan standar adalah |
|
kudu.client.default-admin-operation-timeout |
Timeout default untuk operasi administratif, seperti Create Table dan Delete Table. Nilai default: 30s. |
|
kudu.client.default-operation-timeout |
Timeout default untuk operasi pengguna. Nilai default: 30s. |
|
kudu.client.default-socket-read-timeout |
Timeout default untuk menunggu data dari socket. Nilai default: 10s. |
|
kudu.client.disable-statistics |
Apakah akan menonaktifkan pengumpulan statistik klien Kudu.
|
Kueri data
Apache Kudu tidak mendukung skema. Namun, Anda dapat mengonfigurasi Kudu connector untuk mengemulasikannya.
Emulasi skema dinonaktifkan (default)
Secara default, emulasi skema dinonaktifkan. Dalam kasus ini, semua tabel Kudu berada dalam skema default.
Misalnya, untuk melakukan kueri terhadap tabel orders, jalankan SELECT * FROM kudu.default.orders. Jika katalog dan skema diatur masing-masing ke kudu dan default, Anda dapat menyederhanakan kueri menjadi SELECT * FROM orders.
Nama tabel Kudu dapat berisi karakter apa pun. Jika nama tersebut mengandung karakter khusus, Anda harus membungkusnya dengan tanda kutip ganda ("). Misalnya, untuk melakukan kueri terhadap tabel special.table!, jalankan SELECT * FROM kudu.default."special.table!".
Contoh:
-
Buat tabel
usersdalam skemadefault.CREATE TABLE kudu.default.users ( user_id int WITH (primary_key = true), first_name varchar, last_name varchar ) WITH ( partition_by_hash_columns = ARRAY['user_id'], partition_by_hash_buckets = 2 );CatatanSaat membuat tabel, Anda harus menentukan informasi yang diperlukan, seperti kunci primer, format encoding dan kompresi kolom, serta partisi hash atau range.
-
Lihat informasi tabel.
DESCRIBE kudu.default.users;Perintah tersebut menghasilkan output yang mirip dengan berikut:
Column | Type | Extra | Comment ------------+---------+-------------------------------------------------+--------- user_id | integer | primary_key, encoding=auto, compression=default | first_name | varchar | nullable, encoding=auto, compression=default | last_name | varchar | nullable, encoding=auto, compression=default | (3 rows) -
Sisipkan data.
INSERT INTO kudu.default.users VALUES (1, 'Donald', 'Duck'), (2, 'Mickey', 'Mouse'); -
Lakukan kueri data.
SELECT * FROM kudu.default.users;
Emulasi skema diaktifkan
Jika Anda mengaktifkan emulasi skema dalam file konfigurasi connector (etc/catalog/kudu.properties), tabel dipetakan ke skema berdasarkan konvensi penamaan.
-
Jika Anda mengatur
kudu.schema-emulation.enabled=truedankudu.schema-emulation.prefix=, tabel dipetakan sebagai berikut:Kudu table name
Nama tabel Presto
orderskudu.default.orderspart1.part2kudu.part1.part2x.y.zkudu.x."y.z"CatatanKarena Kudu tidak mendukung skema secara native, Presto membuat tabel khusus bernama
$schemasuntuk mengelolanya. -
Jika Anda mengatur
kudu.schema-emulation.enabled=truedankudu.schema-emulation.prefix=presto::, tabel dipetakan sebagai berikut:Nama tabel Kudu
Nama tabel Presto
orderskudu.default.orderspart1.part2kudu.default."part1.part2"x.y.zkudu.default."x.y.z"presto::part1.part2kudu.part1.part2presto::x.y.zkudu.x."y.z"CatatanKarena Kudu tidak mendukung skema secara native, Presto membuat tabel khusus bernama
presto::$schemasuntuk mengelolanya.
Pemetaan tipe data
Tabel berikut mencantumkan pemetaan tipe data antara Presto dan Kudu.
|
Tipe Presto |
Tipe Kudu |
Keterangan |
|
BOOLEAN |
BOOL |
N/A |
|
TINYINT |
INT8 |
|
|
SMALLINT |
INT16 |
|
|
INTEGER |
INT32 |
|
|
BIGINT |
INT64 |
|
|
REAL |
FLOAT |
|
|
DOUBLE |
DOUBLE |
|
|
VARCHAR |
STRING |
Saat Anda membuat tabel Kudu dari tabel Presto dengan pernyataan |
|
VARBINARY |
BINARY |
|
|
TIMESTAMP |
UNIXTIME_MICROS |
Pemetaan ini mengurangi presisi kolom Kudu dari mikrodetik (µs) menjadi milidetik (ms). |
|
DECIMAL |
DECIMAL |
Hanya didukung oleh Kudu 1.7.0 dan versi yang lebih baru. |
|
DATE |
N/A |
Tidak didukung. Saat Anda membuat tabel Kudu dari tabel Presto dengan pernyataan |
|
CHAR |
N/A |
Tidak didukung. |
|
TIME |
||
|
JSON |
||
|
TIME WITH TIME ZONE |
||
|
TIMESTAMP WITH TIME ZONE |
||
|
INTERVAL YEAR TO MONTH |
||
|
INTERVAL DAY TO SECOND |
||
|
ARRAY |
||
|
MAP |
||
|
IPADDRESS |
Pernyataan SQL Presto yang didukung
Pernyataan ALTER SCHEMA ... RENAME TO ... tidak didukung.
|
Pernyataan |
Deskripsi |
|
|
Tidak ada. |
|
|
Tidak ada. |
|
|
Tidak ada. |
|
|
Tidak ada. |
|
|
Hanya tersedia saat emulasi skema diaktifkan. |
|
|
Hanya tersedia saat emulasi skema diaktifkan. |
|
|
Membuat tabel. Untuk detailnya, lihat Buat tabel. |
|
|
Tidak ada. |
|
|
Tidak ada. |
|
|
Tidak ada. |
|
|
Menambahkan kolom. Untuk detailnya, lihat Tambah kolom. |
|
|
Pernyataan ini hanya berlaku untuk kolom yang bukan bagian dari kunci primer. |
|
|
|
|
|
Tidak ada. |
|
|
Tidak ada. |
|
|
Tidak ada. |
|
|
Tidak ada. |
|
|
Pernyataan ini setara dengan |
|
|
Menambahkan partisi range. Untuk detailnya, lihat Partisi range. |
|
|
Menghapus partisi range. Untuk detailnya, lihat Partisi range. |
Buat tabel
Untuk membuat tabel, tentukan kolom, tipe data, dan informasi partisi. Anda juga dapat menentukan detail lainnya, seperti format encoding atau format kompresi kolom. Berikut contohnya.
CREATE TABLE user_events (
user_id int WITH (primary_key = true),
event_name varchar WITH (primary_key = true),
message varchar,
details varchar WITH (nullable = true, encoding = 'plain')
) WITH (
partition_by_hash_columns = ARRAY['user_id'],
partition_by_hash_buckets = 5,
number_of_replicas = 3
);
Dalam contoh ini, kunci primer terdiri dari kolom user_id dan event_name. Tabel dibagi menjadi lima partisi berdasarkan nilai hash kolom user_id. number_of_replicas diatur ke 3.
Saat membuat tabel, perhatikan hal-hal berikut:
-
Kolom kunci primer harus dicantumkan terlebih dahulu. Kolom kunci partisi harus merupakan subset dari kolom kunci primer.
-
number_of_replicas: Jumlah replika tablet, yang harus berupa angka ganjil. Jika tidak ditentukan, nilai default dari konfigurasi Kudu Master yang digunakan. -
Kudu mendukung partisi hash dan range. Partisi hash mendistribusikan baris ke dalam bucket berdasarkan nilai hash. Partisi range mendistribusikan baris berdasarkan rentang kunci partisi yang terurut, dan rentang spesifiknya harus dibuat secara eksplisit. Kudu mendukung partisi multi-level. Sebuah tabel harus memiliki setidaknya satu partisi hash atau range. Tabel dapat memiliki beberapa partisi hash tetapi paling banyak satu partisi range.
Properti kolom
Anda dapat menentukan properti kolom berikut selain nama dan tipe data kolom.
|
Parameter |
Tipe |
Deskripsi |
|
primary_key |
BOOLEAN |
Jika true, kolom ini merupakan bagian dari kunci primer. Kunci primer Kudu memberlakukan batasan unik. Jika Anda menyisipkan baris dengan kunci primer yang sudah ada, baris yang ada akan diperbarui. Untuk informasi selengkapnya, lihat Primary Key Design. |
|
nullable |
BOOLEAN |
Jika true, kolom dapat bernilai null. Penting
Kolom kunci primer tidak boleh bernilai null. |
|
encoding |
VARCHAR |
Format encoding kolom, yang mengurangi penyimpanan dan meningkatkan kinerja kueri. Jika tidak ditentukan, Kudu secara otomatis memilih encoding berdasarkan tipe data kolom. Nilai yang valid: auto, plain, bitshuffle, runlength, prefix, dictionary, dan group_varint. Untuk informasi selengkapnya, lihat Column Encoding. |
|
compression |
VARCHAR |
Format kompresi kolom. Jika tidak ditentukan, Kudu menggunakan format kompresi default. Nilai yang valid: |
Berikut contohnya:
CREATE TABLE mytable (
name varchar WITH (primary_key = true, encoding = 'dictionary', compression = 'snappy'),
index bigint WITH (nullable = true, encoding = 'runlength', compression = 'lz4'),
comment varchar WITH (nullable = true, encoding = 'plain', compression = 'default'),
...
) WITH (...);
Desain partisi
Bagian ini menjelaskan cara menentukan partisi hash dan range.
-
Partisi hash
-
Menentukan satu grup partisi
Gunakan properti tabel partition_by_hash_columns dan
partition_by_hash_bucketsuntuk menentukan kolom kunci partisi dan jumlah partisi, masing-masing. Semua kolom kunci partisi harus merupakan subset dari kolom kunci primer. Berikut contohnya:CREATE TABLE mytable ( col1 varchar WITH (primary_key=true), col2 varchar WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['col1', 'col2'], partition_by_hash_buckets = 4 )CatatanContoh ini menentukan partisi hash pada kolom
col1dancol2serta mendistribusikan data ke dalam empat partisi. -
Menentukan dua grup partisi
Untuk menentukan dua grup partisi hash independen, Anda juga harus menentukan properti tabel
partition_by_second_hash_columnsdanpartition_by_second_hash_buckets. Berikut contohnya:CREATE TABLE mytable ( col1 varchar WITH (primary_key=true), col2 varchar WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['col1'], partition_by_hash_buckets = 2, partition_by_second_hash_columns = ARRAY['col2'], partition_by_second_hash_buckets = 3 )CatatanContoh ini menentukan dua grup partisi hash. Grup pertama mendistribusikan baris ke dalam dua partisi berdasarkan kolom
col1. Grup kedua mendistribusikan baris ke dalam tiga partisi berdasarkan kolomcol2. Tabel memiliki total enam partisi (2 × 3).
-
-
Partisi range
Tabel Kudu dapat memiliki paling banyak satu partisi range, yang dapat Anda definisikan menggunakan properti tabel
partition_by_range_columns. Saat membuat tabel, Anda dapat menentukan rentang partisi menggunakan properti tabelrange_partitions. Untuk mengelola partisi range pada tabel yang sudah ada, gunakan prosedur tersimpankudu.system.add_range_partitiondankudu.system.drop_range_partition. Berikut contohnya:CREATE TABLE events ( rack varchar WITH (primary_key=true), machine varchar WITH (primary_key=true), event_time timestamp WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['rack'], partition_by_hash_buckets = 2, partition_by_second_hash_columns = ARRAY['machine'], partition_by_second_hash_buckets = 3, partition_by_range_columns = ARRAY['event_time'], range_partitions = '[{"lower": null, "upper": "2018-01-01T00:00:00"}, {"lower": "2018-01-01T00:00:00", "upper": null}]' )CatatanContoh ini menentukan tabel dengan dua grup partisi hash dan satu partisi range pada kolom
event_time. Rentang tersebut dibagi pada timestamp2018-01-01T00:00:00. -
Kelola partisi range
Contoh berikut menunjukkan operasi partisi:
-
Tambah partisi range
CALL kudu.system.add_range_partition(<YOUR_SCHEMA_NAME>, <YOUR_TABLE_NAME>, <range_partition_as_json_string>) -
Hapus partisi range
CALL kudu.system.drop_range_partition(<YOUR_SCHEMA_NAME>, <YOUR_TABLE_NAME>, <range_partition_as_json_string>)
Parameter
Deskripsi
<YOUR_SCHEMA_NAME>Skema tempat tabel berada.
<YOUR_TABLE_NAME>Nama tabel.
<range_partition_as_json_string>Batas atas dan bawah partisi range, ditentukan sebagai string JSON. Gunakan format
'{"lower": <value>, "upper": <value>}'. Jika partisi memiliki beberapa kolom, gunakan format'{"lower": [<value_col1>,...], "upper": [<value_col1>,...]}'. Format nilai bergantung pada tipe data kolom. Daftar berikut memetakan tipe data ke format string JSON yang diperlukan:-
BIGINT:
'{"lower": 0, "upper": 1000000}' -
SMALLINT:
'{"lower": 10, "upper": null}' -
VARCHAR:
'{"lower": "A", "upper": "M"}' -
TIMESTAMP:
'{"lower": "2018-02-01T00:00:00.000", "upper": "2018-02-01T12:00:00.000"}' -
BOOLEAN:
'{"lower": false, "upper": true}' -
VARBINARY: String yang di-encode Base64.
CatatanNilai
nullmenunjukkan batas yang tidak terbatas.Berikut contohnya:
CALL kudu.system.add_range_partition('myschema', 'events', '{"lower": "2018-01-01", "upper": "2018-06-01"}')CatatanContoh ini menambahkan partisi range ke tabel
eventsdalam skemamyschema. Batas bawah partisi adalah2018-01-01, yang sesuai dengan timestamp2018-01-01T00:00:00.000. Batas atas adalah2018-06-01.Gunakan pernyataan
SHOW CREATE TABLEuntuk melihat partisi range yang sudah ada. Informasi ini muncul dalam properti tabelrange_partitions. -
Tambah kolom
Gunakan pernyataan ALTER TABLE ... ADD COLUMN ... untuk menambahkan kolom ke tabel yang sudah ada. Anda juga dapat menentukan properti kolom untuk kolom baru tersebut. Untuk detail tentang properti kolom, lihat Buat tabel.
ALTER TABLE mytable ADD COLUMN extraInfo varchar WITH (nullable = true, encoding = 'plain')