All Products
Search
Document Center

Hologres:INSERT OVERWRITE

Last Updated:Oct 10, 2026

Hologres mendukung INSERT OVERWRITE melalui prosedur tersimpan hg_insert_overwrite (V2.0+) dan sintaks native INSERT OVERWRITE (V3.1+).

Perbandingan fitur

Perilaku INSERT OVERWRITE bervariasi tergantung pada jenis tabel dan metode yang digunakan:

  • Tabel non-partisi: Kedua metode didukung.

  • Tabel partisi fisik: Gunakan prosedur tersimpan hg_insert_overwrite.

  • Tabel partisi logis: Gunakan prosedur tersimpan hg_insert_overwrite (secara internal memanggil sintaks native INSERT OVERWRITE).

  • Migrasi tabel partisi fisik ke tabel partisi logis: Sesuaikan node impor data.

Jenis tabel

Item perbandingan

hg_insert_overwrite

Native INSERT OVERWRITE

Tabel non-partisi

Didukung

Didukung

Tabel partisi fisik

Impor ke tabel induk

  • Impor dengan atau tanpa tabel anak

  • Impor ke tabel anak tertentu

Tidak didukung

Impor ke tabel anak

Didukung (diperlakukan sebagai tabel non-partisi)

Didukung (diperlakukan sebagai tabel non-partisi)

Tabel partisi logis

Impor ke tabel induk (tanpa menentukan tabel anak)

Tidak didukung

Tidak didukung

Impor ke tabel induk (dengan tabel anak yang ditentukan)

Didukung

Didukung

Catatan

Untuk menggunakan hg_insert_overwrite atau sintaks native INSERT OVERWRITE, pastikan instans Anda memenuhi persyaratan versi. Untuk detailnya, lihat Upgrade an instance. Jika Anda tidak dapat melakukan upgrade, gunakan tabel temporary untuk menjalankan operasi INSERT OVERWRITE.

Gunakan native INSERT OVERWRITE

Ikhtisar

  • Sintaks native INSERT OVERWRITE tersedia mulai Hologres V3.1.

  • Sintaks native INSERT OVERWRITE mendukung jenis tabel berikut:

    • Tabel non-partisi.

    • Tabel anak dari tabel partisi fisik (diperlakukan sebagai tabel non-partisi).

    • Tabel partisi logis, dengan partisi yang ditentukan.

Batasan

  • Sintaks native INSERT OVERWRITE secara default mengaktifkan transaksi DML campuran: SET hg_experimental_enable_transaction = on;. Untuk informasi tentang kemampuan transaksi di Hologres, lihat SQL transactions.

    • Pernyataan INSERT OVERWRITE dan DDL tidak dapat digabung dalam satu transaksi yang sama.

    • Semua pernyataan DML dalam suatu transaksi hanya akan dikomit saat perintah COMMIT dieksekusi.

  • Sebelum Hologres V4.0, sintaks native INSERT OVERWRITE tidak menghasilkan log biner untuk tabel yang telah mengaktifkan binary logging. Mulai Hologres V4.0, sintaks ini menghasilkan log biner. Pembuatan log biner dapat menambah beban penyimpanan yang besar, sehingga kami menyarankan Anda menonaktifkannya kecuali jika benar-benar diperlukan. Untuk menonaktifkan pembuatan log biner pada tingkat sesi, jalankan perintah berikut: SET hg_experimental_generate_binlog = off;.

  • Atomicitas baca dijamin secara default tetapi menimbulkan overhead metadata yang lebih tinggi dan dapat meningkatkan latensi DQL (gudang virtual secondary lebih terpengaruh). Operasi INSERT OVERWRITE yang berjalan lama dapat menyebabkan kegagalan baca seperti Data version is inconsistent atau Insert overwrite version not match.

    • Jika atomicitas baca tidak diperlukan, nonaktifkan GUC untuk tugas DQL: set hg_experimental_enable_check_data_version=off. Tugas DQL kemudian mungkin memindai campuran file data dari sebelum dan sesudah operasi INSERT OVERWRITE.

    • Jika atomicitas baca diperlukan tetapi latensi DQL harus dikurangi, jalankan tugas DQL pada gudang virtual primary.

Sintaks

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

Parameter

Parameter

Wajib

Deskripsi

target_table_name

Ya

Nama tabel target.

partition_key dan partition_value

Tidak

Kunci dan nilai partisi. Wajib untuk tabel partisi logis.

expression

Tidak

Ekspresi atau nilai untuk kolom yang sesuai di tabel target.

query

Tidak

Pernyataan SELECT yang hasilnya menimpa data di tabel target_table_name.

Catatan

Jika target_table_name adalah tabel partisi logis dan partition_value menentukan suatu partisi, hanya data yang termasuk dalam partisi tersebut yang akan diimpor. Data di luar partisi yang ditentukan diabaikan, dan partisi tersebut akan dikosongkan jika tidak ditemukan data yang sesuai.

Contoh

Impor ke tabel non-partisi

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

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

Impor ke tabel partisi logis

-- Buat tabel A sebagai tabel target.
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 input.
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';

Implementasikan INSERT OVERWRITE melalui hg_insert_overwrite

Riwayat versi

  • Mulai V3.1, hg_insert_overwrite mendukung tabel partisi logis (partisi harus ditentukan).

  • Mulai V3.0, hg_insert_overwrite mendukung impor langsung ke tabel induk.

  • Tabel dengan dependensi view: Untuk V2.0.15+, aktifkan dengan: set hg_experimental_hg_insert_overwrite_enable_view=on;. Tabel dengan dependensi Materialized View tidak didukung.

    Untuk V3.0+, tidak diperlukan konfigurasi tambahan, tetapi dependensi Materialized View tetap tidak didukung.

  • Jika hg_insert_overwrite gagal, bersihkan tabel temporary secara manual. Mulai V3.0, gunakan SQL berikut.

    -- 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 penggunaan

  • Impor subset field harus sesuai dengan urutan kolom tabel sumber.

  • hg_insert_overwrite memerlukan izin pemilik tabel (hanya superuser atau pemilik tabel).

  • Kunci partisi mendukung tipe INT, TEXT, atau VARCHAR.

  • Mulai V3.0, hg_insert_overwrite tidak dapat digunakan di dalam transaksi.

    Catatan

    Pada versi sebelumnya, penggunaan hg_insert_overwrite dalam transaksi berisiko menyebabkan deadlock atau hang.

  • Mulai V3.0, jumlah kolom dan tipe data dalam sql dari hg_insert_overwrite harus persis sesuai dengan target_table. Ketidaksesuaian akan menghasilkan 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".

Perubahan perilaku

Jika hanya target_table (tabel induk) dan sql diberikan:

Sebelum V3.0, operasi ini gagal. Mulai V3.0, kemungkinan hasilnya:

  • Jika semua tabel anak dalam hasil sql ada, operasi berhasil.

  • Jika ada tabel anak yang tidak ada, akan terjadi error.

Sintaks

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

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

Parameter

Catatan

Mulai V3.0, partition_value untuk hg_insert_overwrite menerima tipe ARRAY, memungkinkan penulisan ke beberapa tabel anak. Tipe TEXT untuk partition_value masih didukung tetapi terbatas pada satu tabel anak.

Parameter

Deskripsi

target_table

Tabel internal Hologres yang sudah ada.

partition_value

Partisi target.

  • Sebelum V3.0: Jika target_table adalah tabel partisi fisik, partition_value (tipe TEXT) wajib. Partisi yang tidak ada akan dibuat secara otomatis.

  • Mulai V3.0: Jika target_table adalah tabel partisi fisik, partition_value (tipe ARRAY atau TEXT) opsional. Lihat tabel perilaku di bawah.

  • Mulai V3.1: Jika target_table adalah tabel partisi logis, partition_value (tipe ARRAY atau TEXT) wajib.

sql

Pernyataan SELECT.

Dapat mengkueri tabel MaxCompute atau Hologres. Escape tanda kutip tunggal dengan $$sql$$.

  • Sebelum V3.0: Hasil harus persis sesuai dengan partition_value.

  • Mulai V3.0: Batasan di atas dihapus. Lihat tabel perilaku di bawah.

auto_create_partition

Mengontrol pembuatan otomatis partisi yang tidak ada. Hanya untuk V3.0+, hanya untuk tabel partisi fisik.

  • TRUE: Secara otomatis membuat partisi yang hilang yang ditemukan dalam hasil sql.

  • FALSE (default): Tidak membuat partisi yang hilang.

Perilaku bergantung pada auto_create_partition dan partition_value. Partisi dianggap "relevan" jika muncul dalam hasil SQL.

  • Perilaku hg_insert_overwrite untuk tabel partisi fisik

    Nilai parameter

    auto_create_partition

    TRUE

    FALSE

    partition_value

    Tidak ditentukan

    • Partisi relevan: Partisi yang ada ditimpa. Partisi yang tidak ada dibuat secara otomatis.

    • Partisi tidak relevan: Diabaikan.

    • Jika semua partisi relevan sudah ada:

      • Partisi relevan ditimpa.

      • Partisi tidak relevan diabaikan.

    • Jika ada partisi relevan yang tidak ada, error dilempar; tidak ada operasi timpa yang dilakukan pada partisi lain.

    Ditentukan

    Untuk partisi yang ditentukan:

    • Partisi relevan yang tidak ada dibuat secara otomatis.

    • Partisi relevan yang ada ditimpa.

    • Data partisi yang ada tetapi tidak relevan dikosongkan.

    Untuk partisi yang tidak ditentukan:

    • Tidak berpengaruh.

    • Untuk partisi yang ditentukan:

      • Jika ada partisi relevan yang tidak ada, error dilempar; tidak ada operasi timpa yang dilakukan pada partisi lain.

      • Partisi relevan yang ada ditimpa.

      • Partisi yang ada tetapi tidak relevan dikosongkan.

    • Untuk partisi yang tidak ditentukan:

      • Tidak berpengaruh.

  • Perilaku hg_insert_overwrite untuk tabel partisi logis

    Tabel partisi logis tidak mendukung partisi otomatis; auto_create_partition diabaikan.

    Nilai parameter

    Deskripsi

    partition_value

    Tidak ditentukan

    Tidak didukung.

    Ditentukan

    Untuk partisi yang ditentukan:

    • Data partisi relevan ditimpa.

    • Partisi tidak relevan dikosongkan.

    Untuk partisi yang tidak ditentukan:

    • Tidak ada yang terpengaruh.

Contoh

Contoh 1: Impor data ke tabel non-partisi

-- Buat tabel A sebagai tabel target.
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 input 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');

-- Masukkan data dari tabel B ke tabel A.
CALL hg_insert_overwrite('public.tablea' , 'SELECT * FROM public.tableb');

Contoh 2: Impor data ke tabel partisi (fisik dan logis)

-- Buat tabel target.
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 input.
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: Impor 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 beberapa saat sebelum mengimpor data ke Hologres. Ini mencegah kegagalan sinkronisasi yang disebabkan oleh inkonsistensi data akibat pembaruan cache metadata Hologres yang lambat.

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: Impor data dari tabel partisi MaxCompute ke partisi 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: Impor data dari tabel partisi MaxCompute ke tabel partisi 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.

Implementasikan INSERT OVERWRITE melalui tabel temporary

Sintaks

Gunakan SQL berikut untuk mengimplementasikan INSERT OVERWRITE.

BEGIN ;

-- Kosongkan 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 ;

Parameter

Parameter

Deskripsi

table_new

Nama tabel temporary.

Mendukung format Schema.Table.

table

Nama tabel yang sudah ada.

Mendukung format Schema.Table

DDL tabel temporary

Ada dua cara membuat tabel temporary:

  • Menyalin dari tabel yang sudah ada:

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

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

Contoh interaksi dengan MaxCompute

Impor ke Hologres (non-partisi)

Timpa data Hologres dengan hasil batch dari MaxCompute. Contoh ini sepenuhnya menimpa tabel Hologres region menggunakan odps_region_10g dari MaxCompute.

BEGIN ;

-- Kosongkan tabel temporary yang 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 ke Hologres (partisi)

Pembaruan harian ke tabel partisi MaxCompute dapat menimpa tabel partisi Hologres untuk mengoreksi data real-time dengan hasil pemrosesan batch. Contoh ini mengimpor data dari odps_lineitem_10g MaxCompute (dipartisi harian berdasarkan ds) ke tabel lineitem Hologres.

BEGIN ;

-- Kosongkan 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;

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

COMMIT ;

Impor ke MaxCompute (non-partisi)

Untuk mengekspor data dari Hologres (holotable) ke mc_holotable MaxCompute, tulis ke tabel temporary terlebih dahulu, lalu ubah namanya untuk sepenuhnya menimpa 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;

Impor data mendukung impor parsial dan penuh:

  • Mengekspor beberapa field:

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

    INSERT INTO mapping_holotable_temp
    SELECT * FROM holotable;