全部产品
Search
文档中心

Lindorm:Akses data berorientasi kolom

更新时间:Jul 02, 2025

Penyimpanan berorientasi kolom adalah metode manajemen data yang menyimpan dan memproses data berdasarkan kolom. Mesin komputasi Lindorm menyediakan penyimpanan berorientasi kolom untuk menyimpan data semi-terstruktur dan terstruktur. Dibandingkan dengan penyimpanan berorientasi baris, penyimpanan berorientasi kolom mengurangi waktu respons kueri dan menghemat sumber daya I/O. Topik ini menjelaskan cara mengakses data berorientasi kolom Lindorm menggunakan mesin komputasi.

Informasi latar belakang

Penyimpanan berorientasi kolom Lindorm adalah layanan penyimpanan terdistribusi berbasis kolom. Penyimpanan berorientasi kolom cocok untuk menyimpan sejumlah besar data semi-terstruktur dan terstruktur dalam skenario seperti Internet of Vehicles (IoV), Internet of Things (IoT), pesanan, dan log. Penyimpanan berorientasi kolom menyediakan kemampuan inti berikut:

  • Komputasi dan Analitik

    Mesin komputasi Lindorm dapat mengakses data berorientasi kolom untuk melakukan analitik interaktif dan komputasi online. Penyimpanan berorientasi kolom menyediakan fitur distribusi data dan kemampuan pengindeksan yang kaya, yang secara efektif mempercepat penempatan dan pengaturan data dalam proses komputasi. Anda dapat menambah, menghapus, memodifikasi, dan mengkueri sejumlah besar data kunci utama menggunakan Pernyataan SQL.

  • Throughput Tinggi

    Penyimpanan berorientasi kolom mendukung penskalaan horizontal dan menyediakan kemampuan untuk membaca dan menulis data terabyte per menit. Hal ini membuatnya cocok untuk skenario data throughput tinggi seperti impor cepat data IoV, akses set data pelatihan model, dan analisis serta produksi laporan skala besar.

  • Efisiensi Biaya

    Lindorm mengimplementasikan teknologi seperti algoritma rasio kompresi tinggi berbasis kolom, media berbiaya rendah berdensitas tinggi, pemisahan data panas dan dingin, pengkodean kompresi, dan penyimpanan arsip data dingin. Dibandingkan dengan penyimpanan yang dikelola sendiri, penyimpanan berorientasi kolom Lindorm secara signifikan mengurangi biaya penyimpanan, memungkinkan Anda mengarsipkan dan menyimpan sejumlah besar data dengan biaya lebih rendah.

  • Ketersediaan Tinggi

    Dengan menggunakan teknologi seperti kode penghapusan, penyimpanan berorientasi kolom Lindorm memastikan ketersediaan tinggi dataset terdistribusi dan menghilangkan risiko titik kegagalan tunggal (SPOF).

  • Kompatibilitas dengan Layanan Open Source

    Penyimpanan berorientasi kolom kompatibel dengan beberapa API standar open source, seperti API Iceberg. Penyimpanan berorientasi kolom juga dapat terhubung ke mesin komputasi seperti Spark dan Flink. Dengan cara ini, penyimpanan berorientasi kolom dapat diintegrasikan secara mulus ke dalam ekosistem data mainstream.

  • Pemisahan Data Panas dan Dingin

    Anda dapat menyimpan data panas dan dingin pada media penyimpanan yang berbeda berdasarkan kebutuhan bisnis Anda. Ini membantu mengurangi overhead kinerja yang disebabkan oleh akses ke data dingin, sambil secara efektif menurunkan biaya penyimpanan.

Prasyarat

Deskripsi fitur

DDL

Namespace

Buat Namespace (Database)

USE lindorm_columnar;
CREATE NAMESPACE mydb;

Hapus Namespace (Database)

USE lindorm_columnar;
DROP NAMESPACE mydb;

Tabel

Buat Tabel

USE lindorm_columnar;
CREATE TABLE mydb.mytable (
  id INT NOT NULL,
  city STRING NOT NULL,
  name STRING,
  score INT)
PARTITIONED BY (city, bucket(128,id))
TBLPROPERTIES(
  'primary-key' = 'id,city');

Berikut ini menjelaskan kunci utama dan metode partisi data.

Kunci Utama

Saat Anda membuat tabel, Anda dapat membuat tabel kunci utama dengan menentukan kunci utama atau membuat tabel non-kunci utama tanpa menentukan kunci utama. Daftar berikut menjelaskan cara membuat tabel kunci utama dan tabel non-kunci utama, serta aturan yang harus Anda ikuti saat membuat tabel:

  • Buat tabel kunci utama. Saat Anda membuat tabel, tentukan parameter kunci utama dalam klausa TBLPROPERTIES. Anda hanya perlu menentukan bidang kunci utama dari tabel. Tabel kunci utama harus memenuhi persyaratan berikut:

    • Banyak bidang dipisahkan dengan koma (,). Tipe data berikut didukung: BOOLEAN, BYTE, SHORT, INT, LONG, FLOAT, DOUBLE, STRING, dan BINARY.

    • Kunci utama tabel berorientasi kolom bersifat unik.

    • Jika kunci utama ditulis beberapa kali, data baru akan menimpa data lama.

    • Anda harus menentukan partisi. Bidang ekspresi partisi tabel harus berupa bidang kunci utama. Partisi tingkat terakhir harus berupa partisi ember.

  • Buat tabel non-kunci utama. Saat Anda membuat tabel, jangan tentukan parameter kunci utama dalam klausa TBLPROPERTIES. Tabel non-kunci utama tidak memerlukan partisi dan tidak menjamin keunikan data. Dalam hal ini, data duplikat mungkin ada.

Metode Partisi Data

Saat Anda membuat tabel, gunakan klausa PARTITIONED BY([ekspresi partisi reguler],{bucket(bucketNum,bucketCol)}) untuk menentukan metode partisi data.

  • Ekspresi Partisi Ember

    • Parameter bucketNum menentukan jumlah shard, yang secara langsung memengaruhi konkurensi penulisan data dan pemindaian.

      Catatan

      Partisi ember yang berbeda memiliki ID partisi yang berbeda, yang ditentukan oleh parameter bucket_index. Parameter bucketNum menentukan jumlah partisi ember dalam partisi reguler.

      • Untuk mendapatkan nilai parameter bucket_index, Anda dapat menggunakan fungsi hash untuk mendapatkan nilai hash dari bidang partisi tertentu, lalu ambil sisa dari nilai Hash dibagi dengan nilai parameter bucketNum. Misalnya, dalam tabel mydb.mytable, indeks ember dihitung sebagai bucket_index = hash(id)%128.

      • Penyimpanan dasar dipartisi berdasarkan nilai parameter bucket_index. Kami sarankan Anda mengevaluasi total volume data sebelum membuat tabel dan menentukan parameter bucketNum dengan benar untuk memastikan bahwa jumlah data dalam partisi ember tunggal adalah 50 hingga 512 MB.

    • Parameter bucketCol menentukan bidang partisi ember.

      Penting

      Untuk menghindari skew data, pastikan nilai parameter bucketCol bersifat diskrit.

    Contoh

    Tentukan hanya partisi ember saat Anda membuat tabel.

    • Contoh 1:

      USE lindorm_columnar;
      CREATE TABLE mydb.mytable (
        id INT NOT NULL,
        city STRING,
        name STRING,
        score DOUBLE)
      PARTITIONED BY (bucket(1024,id))
      TBLPROPERTIES(
        'primary-key' = 'id');
    • Contoh 2:

      USE lindorm_columnar;
      CREATE TABLE mydb.mytable (
        id INT NOT NULL,
        timestamp LONG NOT NULL,
        city STRING,
        name STRING,
        score DOUBLE)
      PARTITIONED BY (bucket(512,timestamp))
      TBLPROPERTIES(
        'primary-key' = 'id,timestamp');
  • Ekspresi Partisi Reguler

    Untuk ekspresi partisi reguler, setiap nilai berbeda menghasilkan partisi fisik dalam penyimpanan dasar. Mekanisme partisi ini membantu mengoptimalkan kinerja kueri melalui pemangkasan data.

    Penting

    Pastikan nilai ekspresi partisi reguler terkonsentrasi. Bidang partisi umum termasuk tanggal, kota, dan gender. Jika ekspresi partisi reguler melibatkan nilai diskrit seperti timestamp, sejumlah besar metadata berorientasi kolom mungkin dihasilkan.

    Contoh

    Tentukan partisi reguler dan partisi ember secara bersamaan saat Anda membuat tabel.

    • Contoh 1:

      USE lindorm_columnar;
      CREATE TABLE mydb.mytable (
        id INT NOT NULL,
        year STRING NOT NULL,
        month STRING NOT NULL,
        day STRING NOT NULL,
        city STRING,
        name STRING,
        score DOUBLE)
      PARTITIONED BY (year, month, day, bucket(1024,id))
      TBLPROPERTIES(
        'primary-key' = 'id, year, month, day');
    • Contoh 2:

      USE lindorm_columnar;
      CREATE TABLE mydb.mytable (
        id INT NOT NULL,
        date STRING NOT NULL,
        city STRING NOT NULL,
        name STRING,
        score DOUBLE)
      PARTITIONED BY (date, city, bucket(1024,id))
      TBLPROPERTIES(
        'primary-key' = 'id,date,city');

Lihat Tabel dalam Namespace Saat Ini

USE lindorm_columnar;
USE mydb;
SHOW TABLES;

Lihat Tabel yang Ada

Anda dapat mengeksekusi pernyataan SQL berikut untuk melihat skema tabel.

USE lindorm_columnar;
SHOW CREATE TABLE mydb.mytable;
DESC mydb.mytable;

Hapus Tabel Tertentu

USE lindorm_columnar;
-- Hapus tabel dan pertahankan file data.
DROP TABLE mydb.mytable;
-- Hapus tabel dan file data.
DROP TABLE mydb.mytable PURGE;

Kosongkan Data dalam Tabel

USE lindorm_columnar;
TRUNCATE TABLE mydb.mytable;

Partisi

Hapus Partisi

Anda dapat mengeksekusi pernyataan DELETE FROM untuk menghapus partisi dengan menentukan klausa WHERE. Contoh:

USE lindorm_columnar;
DELETE FROM mydb.mytable WHERE city = 'beijing';

DML

Tabel

Masukkan Data ke dalam Tabel

  • Contoh 1:

    USE lindorm_columnar;
    INSERT INTO mydb.mytable VALUES (0, 'beijing', 'zhang3', 99);
  • Contoh 2:

    USE lindorm_columnar;
    INSERT INTO mydb.mytable SELECT id, city, name, score FROM another_table;

Kueri Data dalam Tabel

  • Contoh 1:

    USE lindorm_columnar;
    SELECT * from mydb.mytable where id=0;
  • Contoh 2:

    USE lindorm_columnar;
    SELECT count(1), sum(score) from mydb.mytable where city = 'beijing';

Tulis ulang data dalam partisi

Setelah Anda menulis data ke partisi berorientasi kolom selama periode waktu tertentu, Anda dapat menjalankan perintah rewrite_data_files atau rewrite_manifest untuk menulis ulang data. Misalnya, Anda dapat menggabungkan file kecil menjadi file yang lebih besar untuk mengurangi redundansi data atau metadata dan meningkatkan kinerja kueri data. Untuk informasi lebih lanjut, lihat rewrite_data_files dan rewrite_manifest.

Catatan

Saat Anda menjalankan perintah rewrite_data_files atau rewrite_manifest, sumber daya database dikonsumsi. Kami sarankan Anda menjalankan perintah selama jam-jam sepi.

  • Contoh 1:

    USE lindorm_columnar;
    CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable');
  • Contoh 2:

    USE lindorm_columnar;
    CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable', where => 'city=\"beijing\"');
  • Contoh 3:

    USE lindorm_columnar;
    CALL lindorm_columnar.system.rewrite_manifest('mydb.mytable'); 

Penyimpanan data panas dan dingin

Dalam kebanyakan kasus, data yang sering diakses disimpan dalam penyimpanan berperforma tinggi dan data historis yang jarang diakses dipindahkan ke penyimpanan berbiaya rendah. Ini membantu mengurangi biaya penyimpanan dan meningkatkan kinerja. Lindorm mendukung pemisahan data panas dan dingin pada tiga level: L1, L2, dan L3. Anda dapat mengembangkan kebijakan untuk konversi antara data panas dan dingin berdasarkan kebutuhan bisnis Anda. Anda dapat menggunakan layanan danau data untuk secara otomatis membuang data antara penyimpanan data panas dan dingin. Ini membantu Anda mengelola biaya penyimpanan secara efektif tanpa memperpanjang waktu respons layanan utama.

Penting

Untuk mengaktifkan fitur konversi otomatis panas-dingin untuk data berorientasi kolom di Lindorm, hubungi dukungan teknis Lindorm (ID DingTalk: s0s3eg3).

Parameter

Saat Anda membuat tabel berorientasi kolom, Anda dapat menentukan atribut CHS (Cold or Hot Storage) untuk menentukan cara membuang data antara penyimpanan dingin dan panas berdasarkan partisi waktu tabel berorientasi kolom. Tabel berikut menjelaskan cara mengonfigurasi parameter CHS.

Parameter

Deskripsi

CHS

Menentukan apakah akan mengaktifkan fitur pemisahan data panas dan dingin. Daftar berikut menjelaskan cara menentukan parameter ini:

  • Satu bilangan bulat panjang. Unit: detik.

    • Jika selisih antara waktu data partisi dan waktu saat ini kurang dari atau sama dengan nilai tersebut, data disimpan di L1.

    • Jika selisih antara waktu data partisi dan waktu saat ini lebih besar dari nilai tersebut, data secara otomatis dibuang ke L2.

    Catatan

    Jika parameter ini diatur ke 259200, data panas dan dingin disimpan secara terpisah dalam dua lapisan.

    • Jika selisih antara waktu data partisi dan waktu saat ini kurang dari atau sama dengan 259.200 detik, data disimpan di L1.

    • Jika selisih antara waktu data partisi dan waktu saat ini lebih besar dari 259.200 detik, data secara otomatis dibuang ke L2.

  • Dua bilangan bulat panjang. Unit: detik. Pisahkan dua bilangan bulat panjang dengan koma. Contoh: num0, num1, di mana num0 harus lebih kecil dari num1.

    • Jika selisih antara waktu data partisi dan waktu saat ini kurang dari atau sama dengan nilai pertama, data disimpan di L1.

    • Jika selisih antara waktu data partisi dan waktu saat ini lebih besar dari nilai pertama tetapi kurang dari atau sama dengan nilai kedua, data secara otomatis dibuang ke L2.

    • Jika selisih antara waktu data partisi dan waktu saat ini lebih besar dari nilai kedua, data secara otomatis dibuang ke L3.

    Catatan

    Jika parameter ini diatur ke 259200, 864000, data panas dan dingin disimpan secara terpisah dalam tiga lapisan.

    • Jika selisih antara waktu data partisi dan waktu saat ini kurang dari atau sama dengan 259.200 detik, data disimpan di L1.

    • Jika selisih antara waktu data partisi dan waktu saat ini lebih besar dari 259.200 detik tetapi kurang dari atau sama dengan 864.000 detik, data secara otomatis dibuang ke L2.

    • Jika selisih antara waktu data partisi dan waktu saat ini lebih besar dari 864.000 detik, data secara otomatis dibuang ke L3.

CHS_L1

Menentukan tipe penyimpanan untuk L1. Format: 'CHS_L1'='storagetype=<tipe penyimpanan yang diinginkan>'.

Catatan

Jika Anda tidak menentukan parameter ini saat membuat tabel, tipe penyimpanan default adalah Penyimpanan Kapasitas.

Jika Anda menyimpan data di cloud, Anda dapat mengatur tipe penyimpanan yang diinginkan ke salah satu nilai berikut:

  • CAPACITY_CLOUD_STORAGE (default): menyimpan data di Penyimpanan Kapasitas.

  • STANDARD_CLOUD_STORAGE: menyimpan data di penyimpanan standar.

  • PERFORMANCE_CLOUD_STORAGE: menyimpan data di penyimpanan performa.

  • CLOUD_ARCHIVE_STORAGE: menyimpan data di penyimpanan arsip.

    Catatan

    Penyimpanan arsip dalam pratinjau internal. Untuk menggunakan penyimpanan arsip, hubungi dukungan teknis Lindorm (ID DingTalk: s0s3eg3).

Jika Anda menyimpan data di disk lokal, Anda dapat mengatur tipe penyimpanan yang diinginkan ke salah satu nilai berikut:

  • CAPACITY_CLOUD_STORAGE (default): menyimpan data di Penyimpanan Kapasitas.

  • LOCAL_SSD_STORAGE: menyimpan data di SSD lokal.

  • LOCAL_HDD_STORAGE: menyimpan sejumlah besar data.

  • LOCAL_EBS_STORAGE: menyimpan data di ESSD lokal.

CHS_L2

Menentukan tipe penyimpanan untuk L2. CHS_L2 memiliki format dan nilai valid yang sama dengan CHS_L1.

Catatan

Anda harus menentukan parameter CHS_L2.

CHS_L3

Menentukan tipe penyimpanan untuk L3. CHS_L3 memiliki format dan nilai valid yang sama dengan CHS_L1.

Catatan

Jika parameter CHS diatur ke dua bilangan bulat panjang, Anda harus menentukan parameter CHS_L3.

CHS_EXP

Menentukan cara mendapatkan waktu data partisi. Format: toSec(${column0},${pattern0},${column1},${pattern1},...${columnN},${patternN}).

Di mana:

  • columnN: bidang partisi waktu. Tipe data yang didukung adalah INTEGER, LONG, STRING, dan DATE.

  • patternN: format bidang partisi waktu yang sesuai. Nilai valid:

    • yyyy: tahun

    • MM: bulan

    • dd: hari

    • HH: jam

    • mm: menit

  • toSec: fungsi sistem yang menghitung waktu data maksimum untuk partisi waktu yang sesuai. Contoh:

    • Anggaplah bidang partisi waktu adalah tahun, bulan, dan hari. Untuk partisi year=2023, month=10, day=2, toSec(year, yyyy) mengembalikan 2023-12-31 23:59:59, toSec(year, yyyy, month, MM) mengembalikan 2023-10-31 23:59:59, dan toSec(year, yyyy, month, MM,day,'dd') mengembalikan 2023-10-02 23:59:59.

    • Anggaplah bidang partisi waktu adalah tanggal. Untuk partisi date=2023-10-02, toSec(date, yyyy-MM-dd) mengembalikan 2023-10-02 23:59:59.

Mesin komputasi Lindorm mendapatkan waktu data partisi maksimum yang dikembalikan dari parameter CHS_EXP dan membuang data partisi ke penyimpanan yang sesuai berdasarkan nilai yang ditentukan oleh parameter CHS.

Contoh

  • Contoh 1:

    Buat tabel bernama table0. Nama bidang partisi adalah tahun, bulan, dan hari. Berdasarkan kebijakan pemisahan data panas dan dingin yang Anda tentkan, data yang disimpan satu bulan (2.592.000 detik) lalu secara otomatis dibuang ke Penyimpanan Kapasitas. Anda dapat mengeksekusi pernyataan berikut untuk membuat tabel:

    CREATE TABLE table0 (col0 INT,year STRING,month STRING,day STRING)
    PARTITIONED BY  (year,month)
    TBLPROPERTIES 
    'CHS'='2592000',
    'CHS_L2'='storagetype=CAPACITY_CLOUD_STORAGE',
    'CHS_EXP'='toSec(year,yyyy,month,MM,day,dd)'
    );
  • Contoh 2:

    Ubah kebijakan pemisahan data panas dan dingin dari table0. Setelah perubahan, data yang disimpan satu bulan (2.592.000 detik) lalu secara otomatis dibuang ke Penyimpanan Kapasitas, dan data yang disimpan tiga bulan (5.184.000 detik) lalu secara otomatis dibuang ke penyimpanan arsip. Anda dapat mengeksekusi pernyataan berikut untuk memperbarui tabel:

    ALTER TABLE table0
    SET TBLPROPERTIES (
    'CHS'='2592000,5184000',
    'CHS_L2'='storagetype=CAPACITY_CLOUD_STORAGE',
    'CHS_L3'='storagetype=CLOUD_ARCHIVE_STORAGE',
    'CHS_EXP'='toSec(year,yyyy,month,MM,day,dd)'
    );
  • Contoh 3:

    Buat tabel bernama table1. Nama bidang partisi adalah dt. Contoh: 2020/12/1. Berdasarkan kebijakan pemisahan data panas dan dingin yang Anda tentukan, data yang disimpan satu bulan (2.592.000 detik) lalu secara otomatis dibuang ke Penyimpanan Kapasitas, dan data yang disimpan tiga bulan (5.184.000 detik) lalu secara otomatis dibuang ke penyimpanan arsip. Anda dapat mengeksekusi pernyataan berikut untuk membuat tabel:

    CREATE TABLE table1 (col0 INT,dt STRING)
    PARTITIONED BY  (dt)
    TBLPROPERTIES (
    'CHS'='2592000,5184000',
    'CHS_L2'='storagetype=CAPACITY_CLOUD_STORAGE',
    'CHS_L3'='storagetype=CLOUD_ARCHIVE_STORAGE',
    'CHS_EXP'='toSec(dt,yyyy/MM/dd)'
    );
Perhatian
  • Anda dapat menentukan parameter CHS saat membuat tabel. Jika Anda ingin mengubah kebijakan pemisahan data panas dan dingin, Anda dapat mengeksekusi pernyataan ALTER TABLE ...SET TBLPROPERTIES....

  • Jika Anda menentukan parameter CHS dengan salah, tabel dapat dibuat dan diperbarui sesuai harapan, tetapi data tidak dapat dibuang secara otomatis antara penyimpanan dingin dan panas.

  • Pembuangan data panas dan dingin dipicu dalam mode asinkron. Selama dan setelah pembuangan data, akses data tidak terpengaruh, tetapi kinerja akses mungkin bervariasi berdasarkan media penyimpanan yang berbeda.

  • Anda hanya dapat mengimplementasikan kebijakan pemisahan data panas dan dingin berdasarkan partisi waktu dalam tabel berorientasi kolom.

Praktik terbaik

Anda dapat menggunakan metode berikut untuk mempercepat kueri atau komputasi data.

Tentukan kunci utama

Jika sejumlah besar dataset disimpan dalam tabel, Anda dapat menentukan kunci utama untuk mempercepat kueri. Rentang data kunci utama yang lebih kecil memberikan hasil percepatan yang lebih baik.

Dalam contoh ini, tabel sampel dibuat dengan mengeksekusi pernyataan berikut:

USE lindorm_columnar;
CREATE TABLE orders (
o_orderkey       INT NOT NULL,
o_custkey        INT,
o_orderstatus    STRING,
o_totalprice     DOUBLE,
o_orderdate      STRING,
o_orderpriority  STRING,
o_clerk          STRING,
o_shippriority   INT,
o_comment        STRING)
PARTITIONED BY (bucket(1024,o_orderkey))
TBLPROPERTIES(
'primary-key' = 'o_orderkey');           
  • Contoh 1:

    USE lindorm_columnar;
    SELECT * FROM orders WHERE o_orderkey=18394;
  • Contoh 2:

    USE lindorm_columnar;
    SELECT count(*) FROM orders WHERE o_orderkey>100000 AND o_orderkey<200000;
  • Contoh 3:

    USE lindorm_columnar;
    SELECT count(*) FROM orders WHERE o_orderkey>100000;

Tambahkan partisi

Dalam mesin penyimpanan berorientasi kolom Lindorm, partisi secara fisik terisolasi satu sama lain. Anda dapat menambahkan partisi untuk mempercepat kueri data.

Dalam contoh ini, tabel sampel dibuat dengan mengeksekusi pernyataan berikut:

USE lindorm_columnar;
CREATE TABLE orders (
o_orderkey       INT NOT NULL,
o_custkey        INT,
o_orderstatus    STRING,
o_totalprice     DOUBLE,
o_orderdate      STRING NOT NULL,
o_orderpriority  STRING,
o_clerk          STRING,
o_shippriority   INT,
o_comment        STRING)
PARTITIONED BY (o_orderdate, bucket(1024,o_orderkey))
TBLPROPERTIES(
'primary-key' = 'o_orderdate,o_orderkey');
  • Contoh 1:

    USE lindorm_columnar;
    SELECT o_orderdate, count(*) FROM orders WHERE o_orderdate='2022-01-01' GROUP BY o_orderdate;
  • Contoh 2:

    USE lindorm_columnar;
    SELECT o_orderdate, count(*) FROM orders WHERE o_orderdate>='2022-01-01' AND o_orderdate<='2022-01-07' GROUP BY o_orderdate;

Akselerasi kueri

Anda dapat menulis ulang data di tabel tertentu atau partisi tertentu dari tabel. Ini membantu meningkatkan keteraturan dan kepadatan data serta meningkatkan kinerja pemindaian data.

Dalam contoh ini, tabel sampel dibuat dengan mengeksekusi pernyataan berikut:

CREATE TABLE mydb.mytable (
  id INT NOT NULL, 
  city STRING NOT NULL, 
  name STRING, 
  score INT)
partitioned by (city, bucket(4, id))
tblproperties('primary-key' = 'id,city');
  • Contoh 1: Tulis ulang data di tabel mydb.mytable.

    CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable');
  • Contoh 2: Tulis ulang data di partisi tertentu.

    CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable', where => 'city=\"beijing\"');

Jika Anda ingin lebih meningkatkan efisiensi kueri setelah menulis ulang data, Anda dapat mengeksekusi pernyataan berikut untuk menentukan parameter tabel:

ALTER TABLE mydb.mytable SET TBLPROPERTIES ('read.scan-major-rewritten-files-only' = true);

Deskripsi Parameter

read.scan-major-rewritten-files-only: menentukan rentang data untuk kueri. Tipe datanya adalah BOOLEAN. Nilai valid:

  • true: hanya mengkueri data yang telah ditulis ulang. Jangan mengkueri data tambahan yang belum ditulis ulang.

  • false (default): mengkueri semua data.

Kueri non-kunci utama

Saat Anda menulis ulang data dalam partisi, data diurutkan berdasarkan kunci utama dalam tabel berorientasi kolom. Setelah Anda membuat tabel, Anda dapat menentukan kunci urutan berdasarkan kebutuhan Anda untuk mempercepat kueri non-kunci utama.

Penting

Setelah Anda menentukan kunci urutan, Anda harus menulis ulang data dalam partisi untuk memastikan performa percepatan. Hanya data yang telah ditulis ulang yang dapat dikueri dan data tambahan tidak dapat dikueri.

Dalam contoh ini, tabel sampel dibuat dengan mengeksekusi pernyataan berikut:

USE lindorm_columnar;
CREATE TABLE orders (
o_orderkey       INT NOT NULL,
o_custkey        INT,
o_orderstatus    STRING,
o_totalprice     DOUBLE ,
o_orderdate      STRING ,
o_orderpriority  STRING,
o_clerk          STRING,
o_shippriority   INT,
o_comment        STRING)
PARTITIONED BY (bucket(1024,o_orderkey))
TBLPROPERTIES(
'primary-key' = 'o_orderkey',
'read.scan-major-rewritten-files-only' = 'true');

Eksekusi pernyataan berikut untuk menentukan kunci urutan:

ALTER TABLE orders WRITE ORDERED BY o_shippriority,o_totalprice;

Eksekusi pernyataan berikut untuk menulis ulang data:

CALL lindorm_columnar.system.rewrite_data_files(table => 'orders');

Anda dapat mengeksekusi pernyataan SQL berikut untuk mengkueri data yang telah ditulis ulang.

  • Contoh 1:

    USE lindorm_columnar;
    SELECT count(*) FROM orders WHERE o_shippriority=0;
  • Contoh 2:

    USE lindorm_columnar;
    SELECT count(*) FROM orders WHERE o_shippriority=0 AND o_totalprice>999.9;