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 |
| 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 | |
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 OVERWRITEnative 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_versionuntuk tugas DQL. Hal ini dapat menyebabkan tugas DQL memindai campuran file data dari sebelum dan sesudah operasiINSERT 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.
CatatanDi 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
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.
|
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
|
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.
|
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_tableyang sesuai dengan hasil eksekusisqlditimpa dengan data. Jika partisi tidak ada, sistem secara otomatis membuat partisi.Partisi
target_tableyang tidak terkait dengan hasil eksekusisqldiabaikan.
Dalam hasil eksekusi
sql, jika semua partisitarget_tableyang sesuai ada:Semua partisi
target_tableyang sesuai dengan hasil eksekusi ditimpa dengan data.Partisi
target_tableyang tidak terkait dengan hasil eksekusi diabaikan.
Dalam hasil eksekusi
sql, jika beberapa partisitarget_tableyang sesuai tidak ada, sistem mengembalikan pesan kesalahan dan tidak menimpa data di partisi mana pun.
Ditetapkan
Untuk partisi
target_tableyang ditentukan olehpartition_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_tableyang tidak ditentukan olehpartition_value:Jika hasil eksekusi
sqlberisi 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_tableyang ditentukan olehpartition_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_tableyang tidak ditentukan olehpartition_value:Jika hasil eksekusi
sqlberisi 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_tableyang ditentukan olehpartition_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_tableyang tidak ditentukan olehpartition_value:Jika hasil eksekusi
sqlberisi 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;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 |
tabel | Nama tabel asli. Nama tabel juga bisa dalam format |
Pernyataan DDL yang digunakan untuk membuat tabel sementara | Anda dapat menggunakan salah satu metode berikut untuk membuat tabel sementara:
|
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;