全部产品
Search
文档中心

Hologres:INSERT OVERWRITE

更新时间:Nov 12, 2025

Hologres secara bertahap mendukung fitur INSERT OVERWRITE di berbagai versi. Mulai Hologres V2.0, fitur ini diimplementasikan melalui prosedur tersimpan hg_insert_overwrite. Mulai V3.1, Hologres mendukung sintaksis INSERT OVERWRITE asli, meningkatkan kenyamanan dan efisiensi.

Perbandingan Fitur

Untuk jenis tabel yang berbeda, metode berbeda dapat digunakan untuk mengimplementasikan INSERT OVERWRITE. Perbedaan spesifik dirangkum dalam tabel berikut. Pilih metode sesuai dengan pertimbangan berikut:

  • Tabel non-partisi: Kedua metode dapat digunakan.

  • Tabel partisi fisik: Disarankan menggunakan prosedur tersimpan hg_insert_overwrite.

  • Tabel partisi logis: Disarankan menggunakan prosedur tersimpan hg_insert_overwrite karena memanggil INSERT OVERWRITE asli.

  • Migrasi dari tabel partisi fisik ke tabel partisi logis: Lihat Adaptasi tugas impor.

Jenis Tabel

Item Perbandingan

Prosedur Tersimpan (hg_insert_overwrite)

Sintaksis INSERT OVERWRITE Asli

Tabel non-partisi

Didukung

Didukung

Tabel partisi fisik

Impor data ke tabel induk

  • Mendukung tidak menentukan tabel anak

  • Mendukung menentukan satu atau lebih tabel anak

Tidak didukung

Impor data ke tabel anak

Didukung (sama seperti tabel non-partisi)

Didukung (sama seperti tabel non-partisi)

Tabel partisi logis

Impor data ke tabel induk (tanpa menentukan partisi)

Tidak didukung

Tidak didukung

Impor data ke tabel induk (dengan partisi ditentukan)

Didukung

Didukung

Catatan

Jika Anda perlu mengimpor data menggunakan prosedur tersimpan hg_insert_overwrite atau sintaksis INSERT OVERWRITE asli, pastikan versi instans Anda memenuhi persyaratan. Untuk informasi lebih lanjut tentang cara meminta peningkatan versi instans, lihat Tingkatkan Instans. Jika Anda tidak dapat meningkatkan instans, Anda juga dapat menggunakan tabel sementara untuk mengimplementasikan fitur INSERT OVERWRITE. Untuk informasi lebih lanjut, lihat Gunakan tabel sementara untuk mengimplementasikan INSERT OVERWRITE.

Gunakan Sintaksis INSERT OVERWRITE Asli syntax

Deskripsi Fitur

  • Hologres V3.1 dan seterusnya mendukung sintaksis INSERT OVERWRITE asli.

  • Sintaksis INSERT OVERWRITE asli berlaku untuk berbagai jenis tabel:

    • Mendukung tabel non-partisi.

    • Mendukung tabel anak (diproses sebagai tabel non-partisi) dari tabel partisi fisik, tetapi tidak mendukung tabel induk dari tabel partisi fisik.

    • Mendukung tabel partisi logis, tetapi partisi harus ditentukan.

Batasan

  • Sintaksis INSERT OVERWRITE asli mengaktifkan transaksi DML campuran secara default: SET hg_experimental_enable_transaction = on;. Untuk informasi lebih lanjut tentang kemampuan transaksi SQL Hologres, lihat Kemampuan Transaksi SQL.

    • Dalam transaksi yang sama, INSERT OVERWRITE dan DDL tidak dapat dicampur.

    • Dalam transaksi yang sama, semua pernyataan DML dikomit saat transaksi selesai, yaitu, saat COMMIT dieksekusi.

  • Sintaksis INSERT OVERWRITE asli tidak mendukung pembuatan log biner untuk tabel dengan pencatatan biner diaktifkan. Nonaktifkan pencatatan biner pada tingkat sesi menggunakan perintah SET hg_experimental_generate_binlog = off;.

  • Pernyataan INSERT OVERWRITE native secara default menjamin pembacaan data atomik. Namun, proses ini menimbulkan overhead metadata yang signifikan, sehingga menyebabkan peningkatan latensi tugas. Latensi ini lebih terasa pada tugas DQL di gudang virtual sekunder dibandingkan dengan gudang virtual primer.

    • Jika atomisitas pembacaan data TIDAK diperlukan: Nonaktifkan GUC hg_experimental_enable_check_data_version untuk tugas DQL. Hal ini dapat menyebabkan tugas DQL memindai campuran file data dari sebelum dan sesudah operasi INSERT OVERWRITE.

    • Jika atomisitas pembacaan data diperlukan dan latensi DQL perlu dikurangi: Eksekusi tugas DQL langsung di gudang virtual primer. Atau, untuk gudang virtual sekunder, konfigurasikan hg_experimental_query_replica_mode='leader_only' untuk memanfaatkan sumber daya gudang virtual primer.

Sintaksis Perintah

INSERT OVERWRITE <target_table_name> 
  [ PARTITION (<partition_key> = '<partition_value>') [, ...]]
  VALUES ( <expression>  [, ...] ) [, ...] | <query>;

Parameter

Parameter

Wajib

Deskripsi

target_table_name

Ya

Nama tabel tujuan.

partition_key dan partition_value

Tidak

Kunci partisi dan nilai partisi. Hanya tabel partisi logis yang didukung.

Catatan

Jika target_table_name adalah tabel partisi logis, Anda harus mengonfigurasi parameter partition_key dan partition_value.

expression

Tidak

Ekspresi atau nilai yang akan ditetapkan ke kolom yang sesuai dari tabel tujuan.

query

Tidak

Pernyataan SELECT standar yang hasil kuerinya akan ditimpa ke dalam tabel target_table_name.

Catatan

Jika target_table_name adalah tabel partisi logis dan parameter partition_value ditentukan, data apa pun dalam hasil kueri yang tidak termasuk dalam partisi yang ditentukan akan diabaikan secara otomatis. Jika hasil kueri tidak berisi data partisi yang sesuai, partisi tersebut dibersihkan.

Contoh

Gunakan Sintaksis INSERT OVERWRITE Asli untuk Mengimpor Data ke Tabel Non-Partisi

-- Buat tabel bernama tablea sebagai tabel tujuan.
CREATE TABLE public.tablea (
    cid INTEGER NOT NULL,
    cname TEXT,
    code INTEGER
    ,PRIMARY KEY (cid)
);

-- Buat tabel bernama tableb sebagai tabel sumber.
CREATE TABLE public.tableb (
    cid INTEGER NOT NULL,
    cname TEXT,
    code INTEGER
    ,PRIMARY KEY (cid)
);

INSERT INTO public.tableb VALUES(1,'aaa',10001),(2,'bbb','10002');

-- Gunakan sintaksis Insert Overwrite asli untuk mengimpor data dari tableb ke tablea.
INSERT OVERWRITE public.tablea SELECT * FROM public.tableb;

Gunakan Sintaksis INSERT OVERWRITE Asli untuk Mengimpor Data ke Tabel Partisi Logis

-- Buat tabel bernama tablea sebagai tabel tujuan partisi logis.
CREATE TABLE public.tablea(
  a TEXT , 
  b INT, 
  c TIMESTAMP, 
  d TEXT,
  ds TEXT,
  PRIMARY KEY(ds,b)
  )
  LOGICAL PARTITION BY LIST(ds);

-- Buat tabel partisi fisik bernama tableb sebagai tabel sumber.
BEGIN;
CREATE TABLE public.tableb(
  a TEXT, 
  b INT, 
  c TIMESTAMP, 
  d TEXT,
  ds TEXT,
  PRIMARY KEY(ds,b)
  )
  PARTITION BY LIST(ds);
CREATE TABLE public.holo_child_3a PARTITION OF public.tableb FOR VALUES IN('20201215');
CREATE TABLE public.holo_child_3b PARTITION OF public.tableb FOR VALUES IN('20201216');
CREATE TABLE public.holo_child_3c PARTITION OF public.tableb FOR VALUES IN('20201217');
COMMIT;

INSERT INTO public.holo_child_3a VALUES('a',1,'2034-10-19','a','20201215');
INSERT INTO public.holo_child_3b VALUES('b',2,'2034-10-20','b','20201216');
INSERT INTO public.holo_child_3c VALUES('c',3,'2034-10-21','c','20201217');

-- Gunakan sintaksis Insert Overwrite asli untuk mengimpor data dari tableb ke tablea.
INSERT OVERWRITE public.tablea PARTITION (ds = '20201215') SELECT * FROM public.tableb WHERE ds='20201215';

Gunakan Prosedur Tersimpan untuk Mengimplementasikan INSERT OVERWRITE

Deskripsi Fitur

  • Mulai Hologres V3.1, Hologres mendukung tabel partisi logis. Prosedur tersimpan hg_insert_overwrite juga mendukung tabel partisi logis, tetapi partisi harus ditentukan secara eksplisit saat digunakan.

  • Di Hologres V3.0, kemampuan prosedur tersimpan hg_insert_overwrite ditingkatkan. Anda dapat menjalankan pernyataan INSERT OVERWRITE untuk mengimpor data ke tabel partisi induk.

  • Mulai Hologres V2.0.15, Anda dapat menjalankan perintah set hg_experimental_hg_insert_overwrite_enable_view=on; untuk mengimpor data ke tabel dengan dependensi tampilan. Mengimpor data ke tabel dengan dependensi materialized view tidak didukung.

    Mulai Hologres V3.0, Anda dapat mengimpor data ke tabel dengan dependensi tampilan tanpa menyetel parameter GUC sebelumnya. Mengimpor data ke tabel dengan dependensi materialized view tidak didukung.

  • Jika impor data menggunakan prosedur tersimpan hg_insert_overwrite gagal, tabel sementara mungkin tetap ada. Sebelum Hologres V3.0, Anda perlu membersihkan tabel sementara secara manual. Mulai Hologres V3.0, Anda dapat membersihkan tabel sementara menggunakan pernyataan SQL berikut:

    --- Hapus tabel sementara yang dibuat oleh sistem sebelum waktu yang ditentukan oleh before_time.
    CALL hg_clean_insert_overwrite_tmp_tables(before_time::timestamptz); 

Batasan

  • Jika Anda ingin mengimpor hanya bidang tertentu, bidang yang ingin diimpor harus dalam urutan yang sama dan sesuai dengan bidang di tabel sumber.

  • Operasi hg_insert_overwrite memerlukan izin pemilik tabel untuk membuat tabel sementara. Oleh karena itu, hanya superuser dan pemilik tabel yang memiliki izin untuk melakukan operasi hg_insert_overwrite.

  • Kolom kunci partisi tabel tujuan dapat berupa tipe INT, TEXT, atau VARCHAR.

  • Di Hologres V3.0 dan seterusnya, Anda tidak dapat menggunakan prosedur tersimpan hg_insert_overwrite dalam transaksi. Jika tidak, pesan kesalahan akan dilaporkan.

    Catatan

    Di versi sebelumnya, menggunakan prosedur tersimpan hg_insert_overwrite dalam transaksi dapat menyebabkan masalah potensial seperti deadlock atau hang dalam situasi tertentu. Versi terbaru mengambil langkah-langkah yang lebih ketat untuk hal ini.

  • Mulai dari Hologres V3.0, jumlah dan tipe data kolom yang ditentukan dalam select_query dari prosedur tersimpan hg_insert_overwrite harus sesuai dengan kolom tabel tujuan. Jika tidak, pesan kesalahan berikut akan dilaporkan: "error: table "hg_alias" has x columns available but x columns specified", or "error: column xx is of type xxx but expression is of type xxx".

Perubahan Perilaku

Mulai Hologres V3.0, prosedur tersimpan hg_insert_overwrite memiliki perubahan perilaku berikut:

Di versi sebelum Hologres V3.0, ketika hanya ada dua parameter input, target_table dan select_query, dan tabel tujuan adalah tabel partisi induk, kesalahan langsung dilaporkan. Mulai Hologres V3.0, situasi berikut mungkin terjadi:

  • Ketika semua tabel partisi anak yang sesuai dengan hasil eksekusi select_query ada, operasi tulis berhasil.

  • Ketika tabel partisi anak yang sesuai dengan hasil eksekusi select_query tidak ada, kesalahan mungkin dilaporkan.

Sintaksis Perintah

-- Sintaksis prosedur tersimpan hg_insert_overwrite sebelum V3.0
CALL hg_insert_overwrite('<target_table>' regclass, ['<partition_value>' TEXT], '<sql>' TEXT);

-- Sintaksis prosedur tersimpan hg_insert_overwrite di Hologres V3.0 dan seterusnya
CALL hg_insert_overwrite('<target_table>' regclass, ['<partition_value>' ARRAY], '<sql>' TEXT, ['<auto_create_partition>' BOOLEAN]);

Parameter

Catatan

Mulai Hologres V3.0, tipe data partition_value dalam pernyataan hg_insert_overwrite diubah menjadi ARRAY, yang berarti Anda dapat menulis data ke tabel partisi fisik induk dan menentukan beberapa tabel partisi fisik anak. Anda masih dapat menggunakan tipe TEXT sebagai parameter input untuk partition_value, tetapi dalam kasus ini, Anda hanya dapat menulis data ke satu tabel partisi fisik anak.

Parameter

Deskripsi

target_table

Tabel internal di Hologres.

Tabel harus sudah ada.

partition_value

Nilai kolom kunci partisi dalam tabel partisi.

  • Sebelum V3.0, jika target_table adalah tabel partisi fisik induk, Anda harus menentukan partition_value (tipe TEXT), yang berarti Anda dapat mengimpor data hanya ke satu tabel partisi anak. Jika tabel partisi anak tidak ada, sistem secara otomatis membuatnya.

  • Mulai dari V3.0, jika target_table adalah tabel partisi fisik induk, Anda dapat memilih apakah akan menentukan partition_value (ARRAY atau tipe TEXT). Untuk informasi lebih lanjut tentang perilaku spesifik, lihat konten berikut.

  • Mulai dari V3.1, jika target_table adalah tabel partisi logis, Anda harus menentukan partition_value (ARRAY atau tipe TEXT).

sql

Pernyataan SELECT standar.

Anda dapat menggunakannya untuk menanyakan tabel di MaxCompute atau Hologres. Anda harus memastikan bahwa nilai bidang partisi yang dikembalikan oleh pernyataan SELECT persis sama dengan partition_value. Jika pernyataan SQL mengandung tanda kutip tunggal (''), Anda perlu menulis ulang sql dalam format $$sql$$ untuk secara otomatis meloloskan tanda kutip tunggal.

  • Sebelum V3.0, Anda perlu memastikan bahwa nilai bidang partisi dalam pernyataan SELECT persis sama dengan partition_value.

  • Mulai dari V3.0, nilai bidang partisi dalam pernyataan SELECT tidak perlu persis sama dengan partition_value. Untuk informasi lebih lanjut tentang perilaku spesifik, lihat konten berikut.

auto_create_partition

Menentukan apakah akan membuat partisi secara otomatis. Parameter ini didukung hanya di V3.0 dan seterusnya, dan hanya berlaku untuk tabel partisi fisik. Parameter ini diabaikan untuk tabel partisi logis.

  • TRUE: Ketika hasil eksekusi sql berisi tabel partisi anak yang tidak ada, sistem secara otomatis membuat tabel partisi fisik anak yang sesuai.

  • FALSE (nilai default): Ketika hasil eksekusi sql berisi tabel partisi anak yang tidak ada, sistem tidak secara otomatis membuat tabel partisi fisik anak yang sesuai.

Mulai V3.0, untuk operasi INSERT OVERWRITE pada tabel partisi induk, yaitu, ketika target_table adalah tabel partisi induk, perilaku pengaturan parameter yang berbeda adalah sebagai berikut:

  • Tabel partisi fisik

    Nilai Parameter

    auto_create_partition

    TRUE

    FALSE

    partition_value

    Tidak ditentukan

    • Semua partisi target_table yang sesuai dengan hasil eksekusi sql ditimpa dengan data. Jika partisi tidak ada, sistem secara otomatis membuat partisi.

    • Partisi target_table yang tidak terkait dengan hasil eksekusi sql diabaikan.

    • Dalam hasil eksekusi sql, jika semua partisi target_table yang sesuai ada:

      • Semua partisi target_table yang sesuai dengan hasil eksekusi ditimpa dengan data.

      • Partisi target_table yang tidak terkait dengan hasil eksekusi diabaikan.

    • Dalam hasil eksekusi sql, jika beberapa partisi target_table yang sesuai tidak ada, sistem mengembalikan pesan kesalahan dan tidak menimpa data di partisi mana pun.

    Ditetapkan

    Untuk partisi target_table yang ditentukan oleh partition_value:

    • Jika partisi tidak ada, sistem secara otomatis membuat partisi.

    • Untuk partisi yang sesuai dengan hasil eksekusi sql, data ditimpa.

    • Untuk partisi yang tidak terkait dengan hasil eksekusi sql, partisi dibersihkan.

    Untuk partisi target_table yang tidak ditentukan oleh partition_value:

    • Jika hasil eksekusi sql berisi partisi yang tidak ditentukan, tidak ada pemrosesan yang dilakukan.

    • Untuk partisi yang tidak terkait dengan hasil eksekusi sql, tidak ada pemrosesan yang dilakukan.

    • Untuk partisi target_table yang ditentukan oleh partition_value:

      • Jika partisi tidak ada, sistem mengembalikan pesan kesalahan dan tidak menimpa data di partisi mana pun.

      • Untuk partisi yang sesuai dengan hasil eksekusi sql, data ditimpa.

      • Untuk partisi yang tidak terkait dengan hasil eksekusi sql, partisi dibersihkan.

    • Untuk partisi target_table yang tidak ditentukan oleh partition_value:

      • Jika hasil eksekusi sql berisi partisi yang tidak ditentukan, tidak ada pemrosesan yang dilakukan.

      • Untuk partisi yang tidak terkait dengan hasil eksekusi sql, tidak ada pemrosesan yang dilakukan.

  • Tabel partisi logis:

    Tabel partisi logis tidak melibatkan pembuatan partisi otomatis (auto_create_partition). Parameter ini diabaikan.

    Nilai Parameter

    Deskripsi

    partition_value

    Tidak ditentukan

    Tidak didukung.

    Ditetapkan

    Untuk partisi target_table yang ditentukan oleh partition_value:

    • Untuk partisi yang sesuai dengan hasil eksekusi sql, data ditimpa.

    • Untuk partisi yang tidak terkait dengan hasil eksekusi sql, partisi dibersihkan.

    Untuk partisi target_table yang tidak ditentukan oleh partition_value:

    • Jika hasil eksekusi sql berisi partisi yang tidak ditentukan, tidak ada pemrosesan yang dilakukan.

    • Untuk partisi yang tidak terkait dengan hasil eksekusi sql, tidak ada pemrosesan yang dilakukan.

Contoh

Contoh 1: Gunakan prosedur tersimpan untuk mengimpor data dari tabel internal Hologres ke tabel non-partisi Hologres

-- Buat tabel bernama tablea sebagai tabel tujuan.
BEGIN;

CREATE TABLE public.tablea (
    cid INTEGER NOT NULL,
    cname TEXT,
    code INTEGER
    ,PRIMARY KEY (cid)
);

CALL set_table_property('public.tablea', 'orientation', 'column');
CALL set_table_property('public.tablea', 'storage_format', 'orc');
CALL set_table_property('public.tablea', 'bitmap_columns', 'cname');
CALL set_table_property('public.tablea', 'dictionary_encoding_columns', 'cname:auto');
CALL set_table_property('public.tablea', 'distribution_key', 'cid');
CALL set_table_property('public.tablea', 'time_to_live_in_seconds', '3153600000');
COMMIT;

-- Buat tabel bernama tableb sebagai tabel sumber.
CREATE TABLE public.tableb (
    cid INTEGER NOT NULL,
    cname TEXT,
    code INTEGER
    ,PRIMARY KEY (cid)
);

INSERT INTO public.tableb VALUES(1,'aaa',10001),(2,'bbb','10002');

-- Panggil prosedur tersimpan hg_insert_overwrite untuk mengimpor data dari tableb ke tablea.
CALL hg_insert_overwrite('public.tablea' , 'SELECT * FROM public.tableb');

Contoh 2: Gunakan prosedur tersimpan untuk mengimpor data dari tabel internal Hologres ke tabel partisi Hologres (tabel partisi fisik atau tabel partisi logis)

-- Buat tabel bernama tableA sebagai tabel tujuan.
BEGIN;
CREATE TABLE public.tableA(
  a TEXT, 
  b INT, 
  c TIMESTAMP, 
  d TEXT,
  ds TEXT,
  PRIMARY KEY(ds,b)
  )
  PARTITION BY LIST(ds);
CALL set_table_property('public.tableA', 'orientation', 'column');
CREATE TABLE public.holo_child_1 PARTITION OF public.tableA FOR VALUES IN('20201215');
CREATE TABLE public.holo_child_2 PARTITION OF public.tableA FOR VALUES IN('20201216');
CREATE TABLE public.holo_child_3 PARTITION OF public.tableA FOR VALUES IN('20201217');
COMMIT;

-- Atau buat tabel partisi logis.
CREATE TABLE public.tableA_lp(
  a TEXT, 
  b INT, 
  c TIMESTAMP, 
  d TEXT,
  ds TEXT,
  PRIMARY KEY(ds,b)
  )
  LOGICAL PARTITION BY LIST(ds);

-- Buat tabel bernama tableB sebagai tabel sumber.
BEGIN;
CREATE TABLE public.tableB(
  a TEXT, 
  b INT, 
  c TIMESTAMP, 
  d TEXT,
  ds TEXT,
  PRIMARY KEY(ds,b)
  )
  PARTITION BY LIST(ds);
CALL set_table_property('public.tableB', 'orientation', 'column');
CREATE TABLE public.holo_child_3a PARTITION OF public.tableB FOR VALUES IN('20201215');
CREATE TABLE public.holo_child_3b PARTITION OF public.tableB FOR VALUES IN('20201216');
CREATE TABLE public.holo_child_3c PARTITION OF public.tableB FOR VALUES IN('20201217');
COMMIT;

INSERT INTO public.holo_child_3a VALUES('a',1,'2034-10-19','a','20201215');
INSERT INTO public.holo_child_3b VALUES('b',2,'2034-10-20','b','20201216');
INSERT INTO public.holo_child_3c VALUES('c',3,'2034-10-21','c','20201217');

-- Tabel partisi fisik
CALL hg_insert_overwrite('public.tableA' , '{20201215,20201216,20201217}'::text[],$$SELECT * FROM public.tableB$$);
-- Tabel partisi logis
CALL hg_insert_overwrite('public.tableA_lp' , '{20201215,20201216,20201217}'::text[],$$SELECT * FROM public.tableB$$);

Contoh 3: Gunakan prosedur tersimpan untuk mengimpor data dari tabel non-partisi MaxCompute ke tabel non-partisi Hologres

-- Buat tabel non-partisi di MaxCompute. Dalam contoh ini, tabel pelanggan dalam dataset publik MaxCompute bernama public_data digunakan. Kode sampel berikut menunjukkan pernyataan DDL yang digunakan untuk membuat tabel pelanggan:
CREATE TABLE IF NOT EXISTS public_data.customer(
  c_customer_sk BIGINT,
  c_customer_id STRING,
  c_current_cdemo_sk BIGINT,
  c_current_hdemo_sk BIGINT,
  c_current_addr_sk BIGINT,
  c_first_shipto_date_sk BIGINT,
  c_first_sales_date_sk BIGINT,
  c_salutation STRING,
  c_first_name STRING,
  c_last_name STRING,
  c_preferred_cust_flag STRING,
  c_birth_day BIGINT,
  c_birth_month BIGINT,
  c_birth_year BIGINT,
  c_birth_country STRING,
  c_login STRING,
  c_email_address STRING,
  c_last_review_date STRING,
  useless STRING);

-- Buat tabel asing di Hologres untuk pemetaan ke tabel sumber di MaxCompute.
CREATE FOREIGN TABLE customer (
    "c_customer_sk" INT8,
    "c_customer_id" TEXT,
    "c_current_cdemo_sk" INT8,
    "c_current_hdemo_sk" INT8,
    "c_current_addr_sk" INT8,
    "c_first_shipto_date_sk" INT8,
    "c_first_sales_date_sk" INT8,
    "c_salutation" TEXT,
    "c_first_name" TEXT,
    "c_last_name" TEXT,
    "c_preferred_cust_flag" TEXT,
    "c_birth_day" INT8,
    "c_birth_month" INT8,
    "c_birth_year" INT8,
    "c_birth_country" TEXT,
    "c_login" TEXT,
    "c_email_address" TEXT,
    "c_last_review_date" TEXT,
    "useless" TEXT
)
SERVER odps_server
OPTIONS (project_name 'public_data', table_name 'customer');

-- Buat tabel internal di Hologres untuk menerima data dari tabel sumber MaxCompute. Dalam contoh ini, tabel berorientasi kolom dibuat.
BEGIN;
CREATE TABLE public.holo_customer (
 "c_customer_sk" INT8,
 "c_customer_id" TEXT,
 "c_current_cdemo_sk" INT8,
 "c_current_hdemo_sk" INT8,
 "c_current_addr_sk" INT8,
 "c_first_shipto_date_sk" INT8,
 "c_first_sales_date_sk" INT8,
 "c_salutation" TEXT,
 "c_first_name" TEXT,
 "c_last_name" TEXT,
 "c_preferred_cust_flag" TEXT,
 "c_birth_day" INT8,
 "c_birth_month" INT8,
 "c_birth_year" INT8,
 "c_birth_country" TEXT,
 "c_login" TEXT,
 "c_email_address" TEXT,
 "c_last_review_date" TEXT,
 "useless" TEXT
);
COMMIT;

-- Impor data ke Hologres.
IMPORT FOREIGN SCHEMA <project_name> LIMIT TO
(customer) FROM server odps_server INTO PUBLIC options(if_table_exist 'update');-- Perbarui tabel asing.
SELECT pg_sleep(30);-- Tunggu beberapa saat sebelum Anda mengimpor data ke Hologres. Jika tidak, operasi impor mungkin gagal karena latensi yang disebabkan oleh pembaruan metadata.

CALL  hg_insert_overwrite('holo_customer', 'SELECT * FROM customer where c_birth_year > 1980');

-- Kueri data tabel sumber MaxCompute di Hologres.
SELECT * FROM holo_customer limit 10;

Contoh 4: Gunakan prosedur tersimpan untuk mengimpor data dari tabel partisi MaxCompute ke tabel partisi anak fisik Hologres

-- Buat tabel partisi di MaxCompute.
DROP TABLE IF EXISTS odps_sale_detail;

CREATE TABLE IF NOT EXISTS odps_sale_detail 
(
    shop_name STRING
    ,customer_id STRING
    ,total_price DOUBLE
)
PARTITIONED BY 
(
    sale_date STRING
)
;

-- Tambahkan partisi 20210815 ke tabel partisi.
ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='20210815')
;

-- Impor data ke partisi 20210815.
INSERT OVERWRITE TABLE odps_sale_detail PARTITION(sale_date='20210815') VALUES 
('s1','c1',100.1),
('s2','c2',100.2),
('s3','c3',100.3)
;

-- Buat tabel asing di Hologres untuk pemetaan ke tabel di MaxCompute.
DROP FOREIGN TABLE IF EXISTS odps_sale_detail;

-- Buat tabel asing.
IMPORT FOREIGN SCHEMA <maxcompute_project> LIMIT TO
(
    odps_sale_detail
) 
FROM SERVER odps_server INTO public 
OPTIONS(if_table_exist 'error',if_unsupported_type 'error');

-- Buat tabel internal di Hologres untuk menerima data dari tabel MaxCompute.
DROP TABLE IF EXISTS holo_sale_detail;

-- Buat tabel partisi (tabel internal) di Hologres.
BEGIN ;
CREATE TABLE IF NOT EXISTS holo_sale_detail
(
    shop_name TEXT
    ,customer_id TEXT 
    ,total_price FLOAT8
    ,sale_date TEXT
)
PARTITION BY LIST(sale_date);
COMMIT;

-- Impor data ke Hologres.
CALL hg_insert_overwrite('holo_sale_detail', '20210815', $$SELECT * FROM public.odps_sale_detail WHERE sale_date='20210815'$$);

-- Kueri data tabel sumber MaxCompute di Hologres.
SELECT * FROM holo_sale_detail;

Contoh 5: Gunakan prosedur tersimpan untuk mengimpor data dari tabel partisi MaxCompute ke tabel partisi induk fisik Hologres

-- Buat tabel partisi di MaxCompute.
DROP TABLE IF EXISTS odps_sale_detail;

CREATE TABLE IF NOT EXISTS odps_sale_detail 
(
    shop_name STRING
    ,customer_id STRING
    ,total_price DOUBLE
)
PARTITIONED BY 
(
    sale_date STRING
)
;

-- Tambahkan partisi 20210815 dan 20210816 ke tabel partisi.
ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='20210815')
;
ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='20210816')
;

-- Masukkan data ke partisi.
INSERT OVERWRITE TABLE odps_sale_detail PARTITION(sale_date='20210815') VALUES 
('s1','c1',100.1),
('s2','c2',100.2),
('s3','c3',100.3)
;
INSERT OVERWRITE TABLE odps_sale_detail PARTITION(sale_date='20210816') VALUES 
('s1','c1',100.1),
('s2','c2',100.2),
('s3','c3',100.3)
;

-- Buat tabel asing di Hologres untuk pemetaan ke tabel sumber di MaxCompute.
DROP FOREIGN TABLE IF EXISTS odps_sale_detail;

-- Buat tabel asing.
IMPORT FOREIGN SCHEMA <maxcompute_project> LIMIT TO
(
    odps_sale_detail
) 
FROM SERVER odps_server INTO public 
OPTIONS(if_table_exist 'error',if_unsupported_type 'error');

-- Buat tabel internal di Hologres untuk menerima data dari tabel MaxCompute.
DROP TABLE IF EXISTS holo_sale_detail;

-- Buat tabel partisi (tabel internal) di Hologres.
BEGIN ;
CREATE TABLE IF NOT EXISTS holo_sale_detail
(
    shop_name TEXT
    ,customer_id TEXT 
    ,total_price FLOAT8
    ,sale_date TEXT
)
PARTITION BY LIST(sale_date);
COMMIT;

-- Impor data ke Hologres. Tidak ada partisi yang ditentukan, dan parameter auto_create_partition disetel ke TRUE. Dalam hal ini, sistem secara otomatis membuat dua partisi dan mengimpor data ke partisi tersebut.
CALL hg_insert_overwrite ('holo_sale_detail', $$SELECT * FROM public.odps_sale_detail$$, TRUE);

-- Kueri data di Hologres.
SELECT * FROM holo_sale_detail;
Catatan

maxcompute_project: Nama proyek tempat tabel partisi MaxCompute berada.

Gunakan Tabel Sementara untuk Mengimplementasikan INSERT OVERWRITE

Sintaksis Perintah

Anda dapat menjalankan pernyataan SQL berikut untuk mengimplementasikan INSERT OVERWRITE.

BEGIN ;

-- Hapus tabel sementara yang ada.
DROP TABLE IF EXISTS <table_new>;

-- Buat tabel sementara.
SET hg_experimental_enable_create_table_like_properties=on;
CALL HG_CREATE_TABLE_LIKE ('<table_new>', 'select * from <table>');

COMMIT ;

-- Impor data ke tabel sementara.
INSERT INTO <table_new> [( <column> [, ...] )]
VALUES ( {<expression>}  [, ...] )
[, ...] | <query>}

ANALYZE <table_new>;

BEGIN ;

-- Hapus tabel asli.
DROP TABLE IF EXISTS  <table>;

-- Ubah nama tabel sementara.
ALTER TABLE <table_new> RENAME TO <table>;

COMMIT ;

Parameter

Parameter

Deskripsi

table_new

Nama tabel sementara yang ingin Anda buat.

Nama tabel juga bisa dalam format Schema.Table.

tabel

Nama tabel asli.

Nama tabel juga bisa dalam format Schema.Table.

Pernyataan DDL yang digunakan untuk membuat tabel sementara

Anda dapat menggunakan salah satu metode berikut untuk membuat tabel sementara:

  • Salin skema tabel asli.

    SET hg_experimental_enable_create_table_like_properties=on;
    CALL HG_CREATE_TABLE_LIKE ('<table_new>', 'select * from <table>');
  • Buat skema.

    CREATE TABLE IF NOT EXISTS <table_new> ([
      {
       column_name column_type [column_constraints, [...]]
       | table_constraints
       [, ...]
      }
    ]);
    
    CALL set_table_property('<table_new>', property, value);

Contoh

Impor data dari MaxCompute ke tabel non-partisi di Hologres

Gunakan metode ini jika Anda perlu mengimpor data dari tabel hasil pemrosesan offline di MaxCompute ke tabel layanan online di Hologres dan menimpa semua data tabel layanan online. Dalam contoh ini, data diimpor dari tabel MaxCompute bernama odps_region_10g ke tabel region di Hologres, dan data yang diimpor menimpa semua data tabel region di Hologres.

BEGIN ;

-- Hapus tabel sementara yang ada.
DROP TABLE IF EXISTS public.region_new;

-- Buat tabel sementara.
SET hg_experimental_enable_create_table_like_properties=on;
CALL HG_CREATE_TABLE_LIKE ('public.region_new', 'select * from public.region');
COMMIT ;

-- Impor data ke tabel sementara.
INSERT INTO public.region_new
SELECT *
FROM public.odps_region_10g;

ANALYZE public.region_new;

BEGIN ;

-- Hapus tabel asli.
DROP TABLE IF EXISTS public.region;

-- Ubah nama tabel sementara.
ALTER TABLE IF EXISTS public.region_new RENAME TO region;

COMMIT ;

Impor data dari MaxCompute ke tabel partisi di Hologres

Gunakan metode ini jika Anda perlu mengimpor data harian yang diperbarui dari tabel partisi di MaxCompute ke tabel partisi di Hologres dan menimpa semua data partisi yang ditentukan di tabel partisi Hologres. Dengan cara ini, Anda dapat menggunakan data offline untuk memperbaiki data real-time. Dalam contoh ini, data diimpor dari tabel MaxCompute bernama odps_lineitem_10g ke tabel lineitem di Hologres, dan data yang diimpor menimpa semua data partisi yang ditentukan di tabel lineitem di Hologres. Kedua tabel dipartisi berdasarkan hari berdasarkan bidang ds.

BEGIN ;

-- Hapus tabel sementara yang ada.
DROP TABLE IF EXISTS public.lineitem_new_20210101;

-- Buat tabel sementara.
SET hg_experimental_enable_create_table_like_properties=on;
CALL HG_CREATE_TABLE_LIKE ('public.lineitem_new_20210101', 'select * from public.lineitem');
COMMIT ;

-- Impor data ke tabel sementara.
INSERT INTO public.lineitem_new_20210101
SELECT *
FROM public.odps_lineitem_10g
WHERE DS = '20210101'

ANALYZE public.lineitem_new_20210101;

BEGIN ;

-- Hapus partisi asli.
DROP TABLE IF EXISTS public.lineitem_20210101;

-- Ubah nama tabel sementara.
ALTER TABLE public.lineitem_new_20210101 RENAME TO lineitem_20210101;

-- Lampirkan tabel sementara ke tabel partisi Hologres.
ALTER TABLE public.lineitem ATTACH PARTITION lineitem_20210101 FOR VALUES IN ('20210101');

COMMIT ;

Impor data dari Hologres ke tabel non-partisi di MaxCompute

Buat tabel sementara jika Anda perlu mengimpor data dari Hologres ke tabel non-partisi di MaxCompute. Setelah data diimpor, ubah nama tabel sementara menjadi nama tabel reguler. Dalam contoh ini, data diimpor dari tabel Hologres bernama holotable ke tabel MaxCompute bernama mc_holotable, dan data yang diimpor menimpa semua data tabel MaxCompute bernama mc_holotable.

-- Buat tabel sementara untuk tabel tujuan di MaxCompute.
CREATE  TABLE if not exists mc_holotable_temp(
    age INT,
    job STRING,
    name STRING
);

-- Buat pemetaan ke tabel sementara di Hologres.
CREATE FOREIGN TABLE "public"."mapping_holotable_temp" (
 "age" INT,
 "job" TEXT,
 "name" TEXT
)
SERVER odps_server
OPTIONS (project_name 'DLF_test',table_name 'mc_holotable_temp');
-- Perbarui tabel asli di Hologres.
UPDATE holotable SET "job" = 'president' WHERE "name" = 'Lily';
-- Tulis data yang diperbarui ke tabel pemetaan untuk tabel sementara.
INSERT INTO mapping_holotable_temp SELECT * FROM holotable;

-- Hapus tabel tujuan asli di MaxCompute.
DROP TABLE IF EXISTS mc_holotable;
-- Ubah nama tabel sementara menjadi nama tabel tujuan.
ALTER TABLE mc_holotable_temp RENAME TO mc_holotable;

Anda dapat mengimpor sebagian bidang atau semua bidang:

  • Ekspor sebagian bidang.

    INSERT INTO mapping_holotable_temp
    SELECT x,x,x FROM holotable;  --x,x,x dapat diganti dengan nama bidang yang ingin Anda ekspor.
  • Ekspor semua bidang.

    INSERT INTO mapping_holotable_temp
    SELECT * FROM holotable;