全部产品
Search
文档中心

Hologres:INSERT OVERWRITE

更新时间:Dec 31, 2025

Hologres mendukung fitur INSERT OVERWRITE di berbagai versi. Di Hologres V2.0 dan yang lebih baru, fitur ini tersedia melalui prosedur tersimpan hg_insert_overwrite. Di Hologres V3.1 dan yang lebih baru, sintaks native INSERT OVERWRITE juga didukung untuk kenyamanan dan efisiensi yang lebih baik.

Perbandingan Fitur

Metode untuk melakukan operasi INSERT OVERWRITE bervariasi tergantung pada jenis tabel. Tabel berikut membandingkan perbedaannya. Anda dapat memilih metode berdasarkan rekomendasi berikut:

  • Tabel standar: Kedua metode didukung.

  • Tabel partisi fisik: Gunakan prosedur tersimpan hg_insert_overwrite.

  • Tabel partisi logis: Gunakan prosedur tersimpan hg_insert_overwrite. Prosedur ini memanggil sintaks native INSERT OVERWRITE.

  • Migrasikan tabel partisi fisik ke tabel partisi logis: Untuk informasi selengkapnya, lihat Adapt data import nodes.

Jenis Tabel

Item Perbandingan

Prosedur Tersimpan (hg_insert_overwrite)

Sintaksis INSERT OVERWRITE Asli

Tabel non-partisi

Didukung

Dukungan

Tabel partisi fisik

Impor data ke tabel induk

  • Mendukung tidak menentukan tabel anak.

  • Mendukung menentukan satu atau beberapa tabel anak.

Tidak didukung

Impor data ke tabel anak

Didukung, sama seperti untuk tabel standar (tabel non-partisi).

Didukung, sama seperti untuk tabel standar (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)

Dukungan

Didukung

Catatan

Untuk menulis data menggunakan prosedur tersimpan hg_insert_overwrite atau sintaks native INSERT OVERWRITE, pastikan versi instans Anda memenuhi persyaratan. Untuk informasi selengkapnya tentang cara meminta peningkatan instans, lihat Upgrade an instance. Jika Anda tidak dapat meningkatkan instans Anda, Anda dapat menggunakan tabel temporary untuk melakukan operasi INSERT OVERWRITE. Untuk informasi selengkapnya, lihat Use a temporary table to perform an INSERT OVERWRITE operation.

Gunakan native INSERT OVERWRITE

Deskripsi Fitur

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

  • Sintaks native INSERT OVERWRITE bervariasi tergantung pada jenis tabel:

    • Tabel standar, yaitu tabel non-partisi.

    • Tabel anak dari tabel partisi fisik. Hologres memperlakukan tabel-tabel ini sebagai tabel standar. Tabel induk dari tabel partisi fisik tidak didukung.

    • Tabel partisi logis. Anda harus menentukan partisi.

Batasan

  • Secara default, sintaks native INSERT OVERWRITE mengaktifkan transaksi Data Manipulation Language (DML) campuran menggunakan perintah SET hg_experimental_enable_transaction = on;. Untuk informasi selengkapnya tentang kemampuan transaksi Hologres, lihat SQL transaction capabilities.

    • Anda tidak dapat mencampur pernyataan INSERT OVERWRITE dan DDL dalam transaksi yang sama.

    • Dalam transaksi yang sama, semua pernyataan DML hanya dikomit setelah Anda menjalankan perintah COMMIT untuk menyelesaikan transaksi.

  • Sintaks native INSERT OVERWRITE tidak mendukung pembuatan binary logs untuk tabel yang telah mengaktifkan binary logging. Anda dapat menonaktifkan binary logging pada tingkat session dengan menjalankan perintah SET hg_experimental_generate_binlog = off;.

  • Secara default, atomicity pembacaan data tabel dijamin selama eksekusi pernyataan native INSERT OVERWRITE. Namun, pembacaan data tabel melibatkan overhead metadata yang signifikan, yang dapat meningkatkan latensi SQL. Latensi tugas Data Query Language (DQL) lebih terpengaruh pada kelompok komputasi follower dibandingkan pada kelompok komputasi leader. Jika operasi Insert Overwrite pada tabel sumber memerlukan waktu lama untuk diselesaikan, tugas pembacaan tabel mungkin gagal dengan error Data version is inconsistent atau Insert overwrite version not match.

    • Jika Anda tidak memerlukan atomicity untuk pembacaan data, Anda dapat menonaktifkan parameter GUC untuk tugas DQL dengan menjalankan set hg_experimental_enable_check_data_version=off. Dalam kasus ini, file data yang dipindai oleh tugas DQL mungkin mencakup campuran file dari sebelum dan sesudah operasi INSERT OVERWRITE.

    • Jika Anda ingin menjamin atomicity pembacaan data dan mengurangi latensi DQL, Anda dapat menjalankan tugas DQL secara langsung menggunakan sumber daya kelompok komputasi leader.

Sintaksis Perintah

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

Deskripsi parameter

Parameter

Wajib

Deskripsi

target_table_name

Ya

Nama tabel sink.

partition_key dan partition_value

Tidak

Kunci partisi dan nilai partisi. Parameter ini hanya untuk tabel partisi logis.

Catatan

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

expression

Tidak

Ekspresi atau nilai yang akan diberikan ke kolom yang sesuai di tabel sink.

query

Tidak

Pernyataan SELECT standar. Hasil kueri akan menimpa data di tabel target_table_name.

Catatan

Jika target_table_name adalah tabel partisi logis dan partition_value ditentukan, data dalam hasil kueri yang tidak termasuk dalam partisi yang ditentukan akan diabaikan secara otomatis. Jika hasil kueri tidak berisi data untuk partisi yang ditentukan, partisi tersebut akan dikosongkan.

Contoh

Gunakan sintaks native INSERT OVERWRITE untuk mengimpor data ke tabel non-partisi

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

-- Buat tabel B untuk entri data.
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 sintaks native INSERT OVERWRITE untuk memasukkan data dari tabel B ke tabel A.
INSERT OVERWRITE public.tablea SELECT * FROM public.tableb;

Gunakan sintaks native INSERT OVERWRITE untuk mengimpor data ke tabel partisi logis

-- Buat tabel A sebagai tabel sink 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 B untuk entri data.
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 sintaks native INSERT OVERWRITE untuk memasukkan data dari tabel B ke tabel A.
INSERT OVERWRITE public.tablea PARTITION (ds = '20201215') SELECT * FROM public.tableb WHERE ds='20201215';

Gunakan prosedur tersimpan untuk melakukan operasi INSERT OVERWRITE

Deskripsi Fitur

  • Hologres V3.1 dan yang lebih baru mendukung tabel partisi logis. Prosedur tersimpan hg_insert_overwrite juga mendukung tabel partisi logis, tetapi Anda harus secara eksplisit menentukan partisi.

  • Hologres V3.0 meningkatkan fitur hg_insert_overwrite. Anda dapat menjalankan perintah INSERT OVERWRITE untuk langsung mengimpor data ke tabel partisi induk.

  • Di Hologres V2.0.15 dan yang lebih baru, Anda dapat menjalankan perintah set hg_experimental_hg_insert_overwrite_enable_view=on; untuk mengaktifkan parameter GUC. Ini memungkinkan Anda mengimpor data ke tabel yang memiliki dependensi view. Anda tidak dapat mengimpor data ke tabel yang memiliki dependensi materialized view.

    Di Hologres V3.0 dan yang lebih baru, Anda dapat mengimpor data ke tabel yang memiliki dependensi view tanpa mengatur parameter GUC ini. Anda tetap tidak dapat mengimpor data ke tabel yang memiliki dependensi materialized view.

  • Jika impor data yang menggunakan prosedur tersimpan hg_insert_overwrite gagal, tabel temporary mungkin tetap ada. Di versi sebelum Hologres V3.0, Anda harus membersihkan tabel temporary secara manual. Di Hologres V3.0 dan yang lebih baru, Anda dapat menjalankan pernyataan SQL berikut untuk membersihkan tabel temporary.

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

Batasan

  • Jika Anda hanya mengimpor subset bidang, bidang-bidang tersebut harus dalam urutan yang sama dengan bidang yang sesuai di tabel sumber.

  • Operasi hg_insert_overwrite memerlukan izin pemilik tabel untuk membuat tabel temporary. Oleh karena itu, hanya superuser atau pemilik tabel yang dapat melakukan operasi ini.

  • Kunci partisi dari tabel sink mendukung tipe data INT, TEXT, atau VARCHAR.

  • Di Hologres V3.0 dan yang lebih baru, Anda tidak dapat menggunakan prosedur tersimpan hg_insert_overwrite dalam transaksi. Jika Anda mencoba melakukannya, error akan dilaporkan.

    Catatan

    Di versi sebelumnya, penggunaan prosedur tersimpan hg_insert_overwrite dalam transaksi dapat menyebabkan masalah seperti deadlock atau hang dalam skenario tertentu. Versi yang lebih baru memberlakukan aturan yang lebih ketat untuk mencegah hal ini.

  • Di Hologres V3.0 dan yang lebih baru, jumlah dan tipe data kolom yang ditentukan dalam select_query prosedur tersimpan hg_insert_overwrite harus persis sesuai dengan kolom target_table. Jika tidak, error seperti "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" akan dilaporkan.

Perubahan Perilaku

Di Hologres V3.0 dan yang lebih baru, prosedur tersimpan hg_insert_overwrite memiliki perubahan perilaku berikut:

Jika Anda hanya memberikan parameter target_table dan select_query dan tabel sink adalah tabel partisi induk, error akan dilaporkan di versi sebelum Hologres V3.0. Di Hologres V3.0 dan yang lebih baru, hasil berikut dimungkinkan:

  • Jika semua partisi anak yang sesuai dengan hasil eksekusi select_query ada, data ditulis berhasil.

  • Jika partisi anak yang sesuai dengan hasil eksekusi select_query tidak ada, error 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]);

Deskripsi parameter

Catatan

Di Hologres V3.0 dan yang lebih baru, tipe data partition_value dalam pernyataan hg_insert_overwrite diubah menjadi ARRAY. Ini memungkinkan Anda menulis data ke tabel partisi induk fisik dan menentukan beberapa partisi anak fisik. Anda masih dapat menggunakan tipe data TEXT untuk parameter partition_value, tetapi Anda hanya dapat menulis data ke satu partisi anak fisik.

Parameter

Deskripsi

target_table

Tabel internal di Hologres.

Ini adalah tabel sink tempat data disimpan. Tabel harus sudah ada.

partition_value

Nilai kunci partisi dalam tabel partisi.

  • Sebelum V3.0, jika target_table adalah tabel partisi induk fisik, Anda harus menentukan partition_value bertipe data TEXT. Artinya, Anda hanya dapat mengimpor data ke satu partisi anak. Jika partisi anak tidak ada, partisi tersebut akan dibuat secara otomatis.

  • Mulai V3.0, jika target_table adalah tabel partisi induk fisik, Anda dapat memilih apakah akan menentukan partition_value bertipe data ARRAY atau TEXT. Untuk informasi selengkapnya tentang perilaku ini, lihat bagian berikut.

  • Mulai V3.1, jika target_table adalah tabel partisi logis, Anda harus menentukan partition_value bertipe data ARRAY atau 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, pastikan bahwa nilai bidang partisi dalam pernyataan SELECT persis sama dengan partition_value.

  • Mulai V3.0, nilai bidang partisi dalam pernyataan SELECT tidak perlu persis sama dengan partition_value. Untuk informasi selengkapnya tentang perilaku ini, lihat bagian berikut.

auto_create_partition

Menentukan apakah partisi dibuat secara otomatis. Parameter ini hanya didukung di V3.0 dan yang lebih baru dan hanya berlaku untuk tabel partisi fisik. Parameter ini diabaikan untuk tabel partisi logis.

  • TRUE: Jika hasil eksekusi sql berisi partisi anak yang tidak ada, partisi anak fisik yang sesuai akan dibuat secara otomatis.

  • FALSE (default): Jika hasil eksekusi sql berisi partisi anak yang tidak ada, partisi anak fisik yang sesuai tidak akan dibuat secara otomatis.

Di V3.0 dan yang lebih baru, untuk operasi INSERT OVERWRITE pada tabel partisi induk di mana target_table adalah tabel partisi induk, perilaku bervariasi berdasarkan pengaturan parameter.

  • Tabel partisi fisik

    Nilai Parameter

    auto_create_partition

    TRUE

    FALSE

    partition_value

    Tidak ditentukan

    • Semua partisi target_table yang sesuai dengan hasil eksekusi sql akan ditimpa. Jika partisi anak tidak ada, partisi tersebut akan dibuat terlebih dahulu secara otomatis.

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

    • Jika semua partisi target_table yang sesuai dengan hasil eksekusi sql ada:

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

      • Partisi target_table yang tidak terkait dengan hasil eksekusi diabaikan.

    • Jika partisi target_table yang sesuai dengan hasil eksekusi sql tidak ada, error akan dilaporkan, dan partisi yang ada tidak akan ditimpa.

    Ditetapkan

    Untuk partisi target_table yang ditentukan oleh partition_value:

    • Jika partisi tidak ada, partisi tersebut akan dibuat secara otomatis.

    • Partisi yang sesuai dengan hasil eksekusi sql akan ditimpa.

    • Partisi yang tidak terkait dengan hasil eksekusi sql akan dikosongkan.

    Untuk partisi target_table yang tidak ditentukan oleh partition_value:

    • Jika hasil eksekusi sql mencakup partisi yang tidak ditentukan, tidak ada tindakan yang diambil.

    • Partisi yang tidak terkait dengan hasil eksekusi sql tidak diproses.

    • Untuk partisi target_table yang ditentukan oleh partition_value:

      • Jika partisi tidak ada, error akan dilaporkan, dan partisi lainnya tidak akan ditimpa.

      • Partisi yang sesuai dengan hasil eksekusi sql akan ditimpa.

      • Partisi yang tidak terkait dengan hasil eksekusi sql akan dikosongkan.

    • Untuk partisi target_table yang tidak ditentukan oleh partition_value:

      • Jika hasil eksekusi sql mencakup partisi yang tidak ditentukan, tidak ada tindakan yang diambil.

      • Partisi yang tidak terkait dengan hasil eksekusi sql tidak diproses.

  • Tabel partisi logis:

    Tabel partisi logis tidak mendukung pembuatan partisi otomatis (auto_create_partition). Oleh karena itu, parameter ini diabaikan.

    Nilai parameter

    Deskripsi

    partition_value

    Tidak ditentukan

    Tidak didukung.

    Ditetapkan

    Untuk partisi target_table yang ditentukan oleh partition_value:

    • Partisi yang sesuai dengan hasil eksekusi sql akan ditimpa.

    • Partisi yang tidak terkait dengan hasil eksekusi sql akan dikosongkan.

    Untuk partisi target_table yang tidak ditentukan oleh partition_value:

    • Jika hasil eksekusi sql mencakup partisi yang tidak ditentukan, tidak ada tindakan yang diambil.

    • Partisi yang tidak terkait dengan hasil eksekusi sql tidak diproses.

Contoh

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

-- Buat tabel A sebagai tabel sink.
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 B untuk entri data.
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 hg_insert_overwrite untuk memasukkan data dari tabel B ke tabel A.
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 (fisik atau logis)

-- Buat tabel A sebagai tabel sink.
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, 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 B untuk entri data.
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. Contoh ini menggunakan data dari tabel customer di proyek public_data, yang merupakan dataset publik di MaxCompute. Kode berikut menyediakan pernyataan DDL untuk tabel tersebut.
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 eksternal di Hologres untuk memetakan ke tabel data 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, seperti tabel berorientasi kolom, untuk menerima data dari tabel sumber MaxCompute.
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 eksternal.
SELECT pg_sleep(30);-- Tunggu periode waktu sebelum mengimpor data ke Hologres. Ini mencegah kegagalan sinkronisasi yang disebabkan oleh inkonsistensi data akibat pembaruan cache metadata yang lambat di Hologres.

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

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

Contoh 4: Gunakan prosedur tersimpan untuk mengimpor data dari tabel partisi MaxCompute ke 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 sumber.
ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='20210815')
;

-- Tulis 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)
;

-- Buat tabel eksternal di Hologres untuk memetakan ke tabel data sumber di MaxCompute.
DROP FOREIGN TABLE IF EXISTS odps_sale_detail;

-- Buat tabel eksternal.
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 sumber 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 dari 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 sumber.
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')
;

-- Tulis 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 eksternal di Hologres untuk memetakan ke tabel data sumber di MaxCompute.
DROP FOREIGN TABLE IF EXISTS odps_sale_detail;

-- Buat tabel eksternal.
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 sumber 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. Jangan tentukan partisi anak dan atur auto_create_partition ke TRUE. Sistem secara otomatis membuat dua partisi anak dan mengimpor data.
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 temporary untuk melakukan operasi INSERT OVERWRITE

Sintaksis Perintah

Anda dapat menjalankan pernyataan SQL berikut untuk melakukan operasi INSERT OVERWRITE.

BEGIN ;

-- Bersihkan tabel temporary yang mungkin ada.
DROP TABLE IF EXISTS <table_new>;

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

COMMIT ;

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

ANALYZE <table_new>;

BEGIN ;

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

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

COMMIT ;

Deskripsi parameter

Parameter

Deskripsi

table_new

Nama tabel temporary baru.

Nama tabel juga bisa dalam format Schema.Table.

tabel

Nama tabel yang sudah ada.

Nama tabel juga bisa dalam format Schema.Table.

Pernyataan DDL untuk tabel temporary

Anda dapat membuat tabel temporary dengan salah satu dari dua cara berikut:

  • Buat struktur tabel baru dengan menyalin tabel yang sudah ada.

    SET hg_experimental_enable_create_table_like_properties=on;
    CALL HG_CREATE_TABLE_LIKE ('<table_new>', 'select * from <table>');
  • Struktur tabel baru

    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

Saat Anda mengimpor data dari MaxCompute ke Hologres, Anda mungkin perlu menimpa semua data yang ada. Ini adalah skenario umum saat Anda mengekspor tabel hasil dari pemrosesan offline ke tabel layanan online. Contoh berikut menunjukkan cara menulis data dari tabel odps_region_10g di MaxCompute ke tabel region di Hologres dan menimpa semua data di tabel region.

BEGIN ;

-- Bersihkan tabel temporary yang mungkin ada.
DROP TABLE IF EXISTS public.region_new;

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

-- Masukkan data ke tabel temporary.
INSERT INTO public.region_new
SELECT *
FROM public.odps_region_10g;

ANALYZE public.region_new;

BEGIN ;

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

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

COMMIT ;

Impor data dari MaxCompute ke tabel partisi di Hologres

Dalam skenario di mana Anda secara rutin memperbarui tabel partisi MaxCompute setiap hari dan perlu mengimpor datanya ke tabel partisi Hologres, Anda mungkin ingin menimpa semua data yang ada untuk memperbaiki data real-time dengan data offline. Contoh berikut menunjukkan cara menulis data dari tabel odps_lineitem_10g di MaxCompute ke tabel lineitem di Hologres dan menimpa semua data di tabel lineitem. Kedua tabel dipartisi berdasarkan hari berdasarkan bidang ds.

BEGIN ;

-- Bersihkan tabel temporary yang mungkin ada.
DROP TABLE IF EXISTS public.lineitem_new_20210101;

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

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

ANALYZE public.lineitem_new_20210101;

BEGIN ;

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

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

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

COMMIT ;

Impor data dari Hologres ke tabel non-partisi di MaxCompute

Untuk mengimpor data dari Hologres ke tabel non-partisi di MaxCompute, Anda dapat menggunakan tabel temporary untuk impor tersebut. Setelah impor selesai, Anda dapat mengubah nama tabel temporary menjadi tabel standar. Contoh berikut menunjukkan cara menulis data dari tabel holotable di Hologres ke tabel mc_holotable di MaxCompute dan menimpa semua data di tabel mc_holotable.

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

-- Buat pemetaan untuk tabel temporary 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 sumber di Hologres.
UPDATE holotable SET "job" = 'president' WHERE "name" = 'Lily';
-- Tulis data yang diperbarui ke pemetaan tabel temporary.
INSERT INTO mapping_holotable_temp SELECT * FROM holotable;

-- Hapus tabel sink lama di MaxCompute.
DROP TABLE IF EXISTS mc_holotable;
-- Ubah nama tabel temporary menjadi tabel sink.
ALTER TABLE mc_holotable_temp RENAME TO mc_holotable;

Anda dapat mengimpor sebagian atau seluruh bidang:

  • Contoh mengekspor beberapa bidang:

    INSERT INTO mapping_holotable_temp
    SELECT x,x,x FROM holotable;  --Anda dapat mengganti x,x,x dengan nama bidang yang ingin diekspor.
  • Contoh mengekspor semua bidang:

    INSERT INTO mapping_holotable_temp
    SELECT * FROM holotable;