Hologres は、さまざまなバージョンで INSERT OVERWRITE 機能を段階的にサポートしてきました。Hologres V2.0 以降、この機能はストアドプロシージャ hg_insert_overwrite を介して実装されています。V3.1 以降、Hologres はネイティブ INSERT OVERWRITE 構文をさらにサポートし、利便性と効率性の両方を向上させています。
機能比較
さまざまなタイプのテーブルに対して、INSERT OVERWRITE を実装するためにさまざまなメソッドを使用できます。具体的な違いは、次の表にまとめられています。次の考慮事項に基づいて適切なメソッドを選択することをお勧めします。
非パーティションテーブル: どちらのメソッドも適用可能です。
物理パーティションテーブル: ストアドプロシージャ hg_insert_overwrite を使用することをお勧めします。
論理パーティションテーブル: ストアドプロシージャ hg_insert_overwrite を使用することをお勧めします。実際、hg_insert_overwrite はネイティブの INSERT OVERWRITE を呼び出します。
物理パーティションテーブルから論理パーティションテーブルへの移行: 詳細については、「インポートタスクの適応」をご参照ください。
テーブルタイプ | 比較項目 | ストアドプロシージャ (hg_insert_overwrite) | ネイティブ INSERT OVERWRITE 構文 |
非パーティションテーブル | サポートされています | サポートされています | |
物理パーティションテーブル | 親テーブルへのデータのインポート |
| サポートされていません |
子テーブルへのデータのインポート | サポートされています (非パーティションテーブルと同じ) | サポートされています (非パーティションテーブルと同じ) | |
論理パーティションテーブル | 親テーブルへのデータのインポート (パーティションを指定しない) | サポートされていません | サポートされていません |
親テーブルへのデータのインポート (パーティションを指定) | サポートされています | サポートされています | |
ストアドプロシージャ hg_insert_overwrite またはネイティブ INSERT OVERWRITE 構文を使用してデータをインポートする必要がある場合は、インスタンスバージョンが要件を満たしていることを確認してください。インスタンスバージョンのアップグレードのリクエスト方法の詳細については、「インスタンスのアップグレード」をご参照ください。インスタンスをアップグレードできない場合は、一時テーブルを使用して INSERT OVERWRITE 機能を実装することもできます。詳細については、「一時テーブルを使用して INSERT OVERWRITE を実装する」をご参照ください。
ネイティブ INSERT OVERWRITE 構文を使用する
機能説明
Hologres V3.1 以降では、ネイティブ INSERT OVERWRITE 構文がサポートされています。
ネイティブ INSERT OVERWRITE 構文は、さまざまなタイプのテーブルに適用されます。
非パーティションテーブルをサポートします。
物理パーティションテーブルの子テーブル (非パーティションテーブルとして処理) をサポートしますが、物理パーティションテーブルの親テーブルはサポートしません。
論理パーティションテーブルをサポートしますが、パーティションを指定する必要があります。
制限事項
ネイティブ INSERT OVERWRITE 構文は、デフォルトで複合 DML トランザクションを有効にします:
SET hg_experimental_enable_transaction = on;。Hologres のトランザクション機能の詳細については、「SQL トランザクション機能」をご参照ください。同じトランザクションでは、INSERT OVERWRITE と DDL を混在させることはできません。
同じトランザクションでは、すべての DML 文は、トランザクションが完了したとき、つまり COMMIT が実行されたときにコミットされます。
ネイティブ INSERT OVERWRITE 構文は、バイナリロギングが有効になっているテーブルのバイナリログの生成をサポートしていません。
SET hg_experimental_generate_binlog = off;コマンドを使用して、セッションレベルでバイナリロギングを無効にする必要があります。ネイティブ
INSERT OVERWRITE文は、デフォルトでデータの原子的な読み取りを保証します。ただし、このプロセスではメタデータに大きなオーバーヘッドが発生し、タスクのレイシーが増加します。このレイテンシーは、プライマリ仮想ウェアハウスと比較して、セカンダリ仮想ウェアハウスの DQL タスクでより顕著になります。データの読み取り原子性が必要ない場合: DQL タスクの
hg_experimental_enable_check_data_versionGUC を無効にします。これにより、DQL タスクがINSERT OVERWRITE操作の前後のデータファイルの混合をスキャンする可能性があります。データの読み取り原子性が必要で、DQL のレイテンシーを削減する必要がある場合: プライマリ仮想ウェアハウスで DQL タスクを直接実行します。または、セカンダリ仮想ウェアハウスの場合は、
hg_experimental_query_replica_mode='leader_only'を設定して、プライマリ仮想ウェアハウスのリソースを活用します。
コマンド構文
INSERT OVERWRITE <target_table_name>
[ PARTITION (<partition_key> = '<partition_value>') [, ...]]
VALUES ( <expression> [, ...] ) [, ...] | <query>;パラメーター
パラメーター | 必須 | 説明 |
target_table_name | はい | 宛先テーブルの名前。 |
partition_key と partition_value | いいえ | パーティションキーとパーティション値。論理パーティションテーブルのみがサポートされています。 説明 target_table_name が論理パーティションテーブルの場合は、partition_key パラメーターと partition_value パラメーターを設定する必要があります。 |
expression | いいえ | 宛先テーブルの対応する列に割り当てる式または値。 |
query | いいえ | クエリ結果が target_table_name テーブルに上書きされる標準 SELECT 文。 説明 target_table_name が論理パーティションテーブルで、partition_value パラメーターが指定されている場合、クエリ結果に含まれる、指定されたパーティションに属さないデータはすべて自動的に無視されます。クエリ結果に対応するパーティションのデータが含まれていない場合、パーティションはクリアされます。 |
例
ネイティブ INSERT OVERWRITE 構文を使用してデータを非パーティションテーブルにインポートする
-- 宛先テーブルとして tablea という名前のテーブルを作成します。
CREATE TABLE public.tablea (
cid INTEGER NOT NULL,
cname TEXT,
code INTEGER
,PRIMARY KEY (cid)
);
-- ソーステーブルとして tableb という名前のテーブルを作成します。
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');
-- ネイティブ Insert Overwrite 構文を使用して、tableb から tablea にデータをインポートします。
INSERT OVERWRITE public.tablea SELECT * FROM public.tableb;ネイティブ INSERT OVERWRITE 構文を使用してデータを論理パーティションテーブルにインポートする
-- 宛先論理パーティションテーブルとして tablea という名前のテーブルを作成します。
CREATE TABLE public.tablea(
a TEXT ,
b INT,
c TIMESTAMP,
d TEXT,
ds TEXT,
PRIMARY KEY(ds,b)
)
LOGICAL PARTITION BY LIST(ds);
-- ソーステーブルとして tableb という名前の物理パーティションテーブルを作成します。
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');
-- ネイティブ Insert Overwrite 構文を使用して、tableb から tablea にデータをインポートします。
INSERT OVERWRITE public.tablea PARTITION (ds = '20201215') SELECT * FROM public.tableb WHERE ds='20201215';ストアドプロシージャを使用して INSERT OVERWRITE を実装する
機能説明
Hologres V3.1 以降、Hologres は論理パーティションテーブルをサポートしています。ストアドプロシージャ hg_insert_overwrite も論理パーティションテーブルをサポートしていますが、使用時にはパーティションを明示的に指定する必要があります。
Hologres V3.0 では、hg_insert_overwrite ストアドプロシージャの機能が強化されています。INSERT OVERWRITE 文を実行して、データを親パーティションテーブルにインポートできます。
Hologres V2.0.15 以降、
set hg_experimental_hg_insert_overwrite_enable_view=on;コマンドを実行して、ビュー依存関係を持つテーブルにデータをインポートできます。マテリアライズドビュー依存関係を持つテーブルへのデータのインポートはサポートされていません。Hologres V3.0 以降、上記の GUC パラメーターを設定せずに、ビュー依存関係を持つテーブルにデータをインポートできます。マテリアライズドビュー依存関係を持つテーブルへのデータのインポートはサポートされていません。
ストアドプロシージャ hg_insert_overwrite を使用したデータインポートが失敗した場合、一時テーブルが残ることがあります。Hologres V3.0 より前では、一時テーブルを手動でクリーンアップする必要がありました。Hologres V3.0 以降、次の SQL 文を使用して一時テーブルをクリーンアップできます。
--- before_time で指定された時間より前にシステムによって作成された一時テーブルを削除します。 CALL hg_clean_insert_overwrite_tmp_tables(before_time::timestamptz);
制限
特定のフィールドのみをインポートする場合、インポートするフィールドは、ソーステーブルのフィールドと同じ順序で対応している必要があります。
hg_insert_overwrite操作では、一時テーブルを作成するためにテーブル所有者権限が必要です。したがって、スーパーユーザーとテーブル所有者のみがhg_insert_overwrite操作を実行する権限を持っています。
デスティネーションテーブルのパーティションキー列は、INT、TEXT、またはVARCHAR型にすることができます。
Hologres V3.0以降では、トランザクション内でhg_insert_overwriteストアドプロシージャを使用することはできません。使用すると、エラーメッセージが報告されます。
説明以前のバージョンでは、特定の状況でトランザクションでストアドプロシージャ hg_insert_overwrite を使用すると、デッドロックやハングなどの潜在的な問題が発生する可能性がありました。後のバージョンでは、これに対してより厳格な対策が講じられています。
Hologres V3.0 以降、ストアドプロシージャ hg_insert_overwrite の select_query で指定された列の数とデータ型は、ターゲットテーブルの列と厳密に対応している必要があります。そうしないと、次のエラーメッセージが報告されます:
"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"。
動作の変更
Hologres V3.0 以降、ストアドプロシージャ hg_insert_overwrite には次の動作の変更があります。
Hologres V3.0 より前のバージョンでは、入力パラメーターが target_table と select_query の 2 つだけで、宛先テーブルが親パーティションテーブルの場合、エラーが直接報告されます。Hologres V3.0 以降、次の状況が発生する可能性があります。
select_query の実行結果に対応するすべての子パーティションテーブルが存在する場合、書き込み操作は成功します。
select_query の実行結果に対応する子パーティションテーブルが存在しない場合、エラーが報告されることがあります。
コマンド構文
-- V3.0 より前の hg_insert_overwrite ストアドプロシージャの構文
CALL hg_insert_overwrite('<target_table>' regclass, ['<partition_value>' TEXT], '<sql>' TEXT);
-- Hologres V3.0 以降の hg_insert_overwrite ストアドプロシージャの構文
CALL hg_insert_overwrite('<target_table>' regclass, ['<partition_value>' ARRAY], '<sql>' TEXT, ['<auto_create_partition>' BOOLEAN]);パラメータ
Hologres V3.0 以降、hg_insert_overwrite 文の partition_value のデータ型は ARRAY に変更されました。これは、物理親パーティションテーブルにデータを書き込み、複数の物理子パーティションテーブルを指定できることを意味します。引き続き TEXT タイプを partition_value の入力パラメーターとして使用できますが、この場合、1 つの物理子パーティションテーブルにのみデータを書き込むことができます。
パラメータ | 説明 |
target_table | Hologres の内部テーブル。 テーブルはすでに存在している必要があります。 |
partition_value | パーティションテーブルのパーティションキー列の値。
|
sql | 標準 SELECT 文。 これを使用して、MaxCompute または Hologres のテーブルをクエリできます。SELECT 文によって返されるパーティションフィールド値が
|
auto_create_partition | パーティションを自動的に作成するかどうかを指定します。このパラメータは V3.0 以後でサポートされており、物理パーティションテーブルに対してのみ有効です。論理パーティションテーブルの場合は、このパラメータは無視されます。
|
V3.0 以降、親パーティションテーブルに対する INSERT OVERWRITE 操作、つまり、target_table が親パーティションテーブルである場合、異なるパラメーター設定の動作は次のとおりです。
物理パーティションテーブル
パラメーター値
auto_create_partition
TRUE
FALSE
partition_value
指定なし
target_tableのsqlの実行結果に対応するすべてのパーティションがデータで上書きされます。パーティションが存在しない場合は、システムによって自動的にパーティションが作成されます。target_tableのsql実行結果に関連しないパーティションは無視されます。
sqlの実行結果で、対応するすべてのtarget_tableパーティションが存在する場合:実行結果に対応するすべての
target_tableパーティションがデータで上書きされます。実行結果に関係のない
target_tableパーティションは無視されます。
sqlの実行結果で、対応する一部のtarget_tableパーティションが存在しない場合、システムはエラーメッセージを返し、どのパーティションのデータも上書きしません。
指定あり
partition_valueで指定されたtarget_tableパーティションの場合:パーティションが存在しない場合は、システムによって自動的にパーティションが作成されます。
sqlの実行結果に対応するパーティションのデータは上書きされます。sqlの実行結果に関連しないパーティションはクリアされます。
partition_valueによって指定されていないtarget_tableパーティションの場合:sqlの実行結果に指定されていないパーティションが含まれている場合、処理は実行されません。sqlの実行結果に関連しないパーティションについては、処理は実行されません。
partition_valueによって指定されたtarget_tableパーティションの場合:パーティションが存在しない場合、システムはエラーメッセージを返し、どのパーティションのデータも上書きしません。
sqlの実行結果に対応するパーティションの場合、データは上書きされます。sqlの実行結果に関係のないパーティションの場合、パーティションはクリアされます。
partition_valueによって指定されていないtarget_tableパーティションの場合:sqlの実行結果に指定されていないパーティションが含まれている場合、処理は行われません。sqlの実行結果に関係のないパーティションの場合、処理は行われません。
論理パーティションテーブル:
論理パーティションテーブルは、自動パーティション作成 (auto_create_partition) を伴いません。このパラメーターは無視されます。
パラメーター値
説明
partition_value
指定なし
サポートされていません。
指定あり
partition_valueによって指定されたtarget_tableパーティションの場合:sqlの実行結果に対応するパーティションの場合、データは上書きされます。sqlの実行結果に関係のないパーティションの場合、パーティションはクリアされます。
partition_valueによって指定されていないtarget_tableパーティションの場合:sqlの実行結果に指定されていないパーティションが含まれている場合、処理は行われません。sqlの実行結果に関係のないパーティションの場合、処理は行われません。
例
例 1: ストアドプロシージャを使用して、Hologres 内部テーブルから Hologres 非パーティションテーブルにデータをインポートする
-- デスティネーションテーブルとして tablea という名前のテーブルを作成します。
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;
-- ソーステーブルとして tableb という名前のテーブルを作成します。
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');
-- hg_insert_overwrite ストアドプロシージャを呼び出して、tableb から tablea にデータをインポートします。
CALL hg_insert_overwrite('public.tablea' , 'SELECT * FROM public.tableb');例 2: ストアドプロシージャを使用して、Hologres 内部テーブルから Hologres パーティションテーブル (物理パーティションテーブルまたは論理パーティションテーブル) にデータをインポートする
-- デスティネーションテーブルとして tableA という名前のテーブルを作成します。
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;
-- または、論理パーティションテーブルを作成します。
CREATE TABLE public.tableA_lp(
a TEXT,
b INT,
c TIMESTAMP,
d TEXT,
ds TEXT,
PRIMARY KEY(ds,b)
)
LOGICAL PARTITION BY LIST(ds);
-- ソーステーブルとして tableB という名前のテーブルを作成します。
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');
-- 物理パーティションテーブル
CALL hg_insert_overwrite('public.tableA' , '{20201215,20201216,20201217}'::text[],$$SELECT * FROM public.tableB$$);
-- 論理パーティションテーブル
CALL hg_insert_overwrite('public.tableA_lp' , '{20201215,20201216,20201217}'::text[],$$SELECT * FROM public.tableB$$);例 3: ストアドプロシージャを使用して、MaxCompute 非パーティションテーブルから Hologres 非パーティションテーブルにデータをインポートする
-- MaxCompute に非パーティションテーブルを作成します。この例では、public_data という名前の MaxCompute パブリックデータセットにある customer テーブルを使用します。次のサンプルコードは、customer テーブルの作成に使用される DDL 文を示しています。
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);
-- MaxCompute のソーステーブルにマッピングするために、Hologres に外部テーブルを作成します。
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');
-- MaxCompute ソーステーブルからデータを受信するために、Hologres に内部テーブルを作成します。この例では、列指向テーブルが作成されます。
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;
-- Hologres にデータをインポートします。
IMPORT FOREIGN SCHEMA <project_name> LIMIT TO
(customer) FROM server odps_server INTO PUBLIC options(if_table_exist 'update');-- 外部テーブルを更新します。
SELECT pg_sleep(30);-- Hologres にデータをインポートする前に一定時間待機します。そうしないと、メタデータの更新によって発生するレイテンシが原因でインポート操作が失敗する可能性があります。
CALL hg_insert_overwrite('holo_customer', 'SELECT * FROM customer where c_birth_year > 1980');
-- Hologres で MaxCompute ソーステーブルのデータをクエリします。
SELECT * FROM holo_customer limit 10;例 4: ストアドプロシージャを使用して、MaxCompute パーティションテーブルから Hologres 物理子パーティションテーブルにデータをインポートする
-- 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
)
;
-- パーティションテーブルに 20210815 パーティションを追加します。
ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='20210815')
;
-- 20210815 パーティションにデータをインポートします。
INSERT OVERWRITE TABLE odps_sale_detail PARTITION(sale_date='20210815') VALUES
('s1','c1',100.1),
('s2','c2',100.2),
('s3','c3',100.3)
;
-- MaxCompute のテーブルにマッピングするために、Hologres に外部テーブルを作成します。
DROP FOREIGN TABLE IF EXISTS odps_sale_detail;
-- 外部テーブルを作成します。
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');
-- MaxCompute テーブルからデータを受信するために、Hologres に内部テーブルを作成します。
DROP TABLE IF EXISTS holo_sale_detail;
-- 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;
-- Hologres にデータをインポートします。
CALL hg_insert_overwrite('holo_sale_detail', '20210815', $$SELECT * FROM public.odps_sale_detail WHERE sale_date='20210815'$$);
-- Hologres で MaxCompute ソーステーブルのデータをクエリします。
SELECT * FROM holo_sale_detail;例 5: ストアドプロシージャを使用して、MaxCompute パーティションテーブルから Hologres 物理親パーティションテーブルにデータをインポートする
-- 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
)
;
-- パーティションテーブルに 20210815 パーティションと 20210816 パーティションを追加します。
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')
;
-- パーティションにデータを挿入します。
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)
;
-- MaxCompute のソーステーブルにマッピングするために、Hologres に外部テーブルを作成します。
DROP FOREIGN TABLE IF EXISTS odps_sale_detail;
-- 外部テーブルを作成します。
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');
-- MaxCompute テーブルからデータを受信するために、Hologres に内部テーブルを作成します。
DROP TABLE IF EXISTS holo_sale_detail;
-- 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;
-- Hologres にデータをインポートします。パーティションは指定されておらず、auto_create_partition パラメータは TRUE に設定されています。この場合、システムは自動的に 2 つのパーティションを作成し、パーティションにデータをインポートします。
CALL hg_insert_overwrite ('holo_sale_detail', $$SELECT * FROM public.odps_sale_detail$$, TRUE);
-- Hologres でデータをクエリします。
SELECT * FROM holo_sale_detail;maxcompute_project: MaxCompute パーティションテーブルが属するプロジェクトの名前。
一時テーブルを使用して INSERT OVERWRITE を実装する
コマンド構文
次の SQL 文を実行して INSERT OVERWRITE を実装できます。
BEGIN ;
-- 既存の一時テーブルを削除します。
DROP TABLE IF EXISTS <table_new>; /* 既存の一時テーブルを削除します。 */
-- 一時テーブルを作成します。
SET hg_experimental_enable_create_table_like_properties=on; /* 一時テーブルを作成します。 */
CALL HG_CREATE_TABLE_LIKE ('<table_new>', 'select * from <table>'); /* 一時テーブルを作成します。 */
COMMIT ;
-- 一時テーブルにデータをインポートします。
INSERT INTO <table_new> [( <column> [, ...] )] /* 一時テーブルにデータをインポートします。 */
VALUES ( {<expression>} [, ...] )
[, ...] | <query>}
ANALYZE <table_new>;
BEGIN ;
-- 元のテーブルを削除します。
DROP TABLE IF EXISTS <table>; /* 元のテーブルを削除します。 */
-- 一時テーブルの名前を変更します。
ALTER TABLE <table_new> RENAME TO <table>; /* 一時テーブルの名前を変更します。 */
COMMIT ;パラメータ
パラメータ | 説明 |
table_new | 作成する一時テーブルの名前。 テーブル名は、 |
table | 元のテーブルの名前。 テーブル名は、 |
一時テーブルの作成に使用されるDDLステートメント | 次のいずれかの方法を使用して一時テーブルを作成できます。
|
例
MaxCompute から Hologres の非パーティションテーブルにデータをインポートする
MaxCompute のオフライン処理の結果テーブルから Hologres のオンライン サービス テーブルにデータをインポートし、オンライン サービス テーブルのすべてのデータを上書きする必要がある場合は、この Topic で説明されている方法を使用できます。この例では、odps_region_10g という名前の MaxCompute テーブルから Hologres の region テーブルにデータがインポートされ、インポートされたデータは Hologres の region テーブルのすべてのデータを上書きします。
BEGIN ;
-- 既存の一時テーブルを削除します。
/* Drop the existing temporary table. */
DROP TABLE IF EXISTS public.region_new;
-- 一時テーブルを作成します。
/* Create a temporary table. */
SET hg_experimental_enable_create_table_like_properties=on;
CALL HG_CREATE_TABLE_LIKE ('public.region_new', 'select * from public.region');
COMMIT ;
-- 一時テーブルにデータをインポートします。
/* Import data into the temporary table. */
INSERT INTO public.region_new
SELECT *
FROM public.odps_region_10g;
ANALYZE public.region_new;
BEGIN ;
-- 元のテーブルを削除します。
/* Drop the original table. */
DROP TABLE IF EXISTS public.region;
-- 一時テーブルの名前を変更します。
/* Rename the temporary table. */
ALTER TABLE IF EXISTS public.region_new RENAME TO region;
COMMIT ;MaxCompute から Hologres のパーティションテーブルにデータをインポートする
MaxCompute のパーティションテーブルから Hologres のパーティションテーブルに毎日更新されるデータをインポートし、パーティション化された Hologres テーブルの指定されたパーティションのすべてのデータを上書きする必要がある場合は、この Topic で説明されている方法を使用できます。このようにして、オフラインデータを使用してリアルタイムデータを修正できます。この例では、odps_lineitem_10g という名前の MaxCompute テーブルから Hologres の lineitem テーブルにデータがインポートされ、インポートされたデータは Hologres の lineitem テーブルの指定されたパーティションのすべてのデータを上書きします。どちらのテーブルも、ds フィールドに基づいて日ごとにパーティション化されています。
BEGIN ;
-- 既存の一時テーブルを削除します。
/* Drop the existing temporary table. */
DROP TABLE IF EXISTS public.lineitem_new_20210101;
-- 一時テーブルを作成します。
/* Create a temporary table. */
SET hg_experimental_enable_create_table_like_properties=on;
CALL HG_CREATE_TABLE_LIKE ('public.lineitem_new_20210101', 'select * from public.lineitem');
COMMIT ;
-- 一時テーブルにデータをインポートします。
/* Import data to the temporary table. */
INSERT INTO public.lineitem_new_20210101
SELECT *
FROM public.odps_lineitem_10g
WHERE DS = '20210101'
ANALYZE public.lineitem_new_20210101;
BEGIN ;
-- 元のパーティションを削除します。
/* Drop the original partition. */
DROP TABLE IF EXISTS public.lineitem_20210101;
-- 一時テーブルの名前を変更します。
/* Rename the temporary table. */
ALTER TABLE public.lineitem_new_20210101 RENAME TO lineitem_20210101;
-- 一時テーブルをパーティション化された Hologres テーブルにアタッチします。
/* Attach the temporary table to the partitioned Hologres table. */
ALTER TABLE public.lineitem ATTACH PARTITION lineitem_20210101 FOR VALUES IN ('20210101');
COMMIT ;Hologres から MaxCompute の非パーティションテーブルにデータをインポートする
Hologres から MaxCompute の非パーティションテーブルにデータをインポートする必要がある場合は、一時テーブルを作成できます。データのインポート後、一時テーブルの名前を通常のテーブルの名前に変更する必要があります。この例では、holotable という名前の Hologres テーブルから mc_holotable という名前の MaxCompute テーブルにデータがインポートされ、インポートされたデータは mc_holotable という名前の MaxCompute テーブルのすべてのデータを上書きします。
-- MaxCompute の宛先テーブルの一時テーブルを作成します。
/* Create a temporary table for the destination table in MaxCompute. */
CREATE TABLE if not exists mc_holotable_temp(
age INT,
job STRING,
name STRING
);
-- Hologres の一時テーブルへのマッピングを作成します。
/* Create the mapping to the temporary table in 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');
-- Hologres の元のテーブルを更新します。
/* Update the original table in Hologres. */
UPDATE holotable SET "job" = 'president' WHERE "name" = 'Lily';
-- 更新されたデータを一時テーブルのマッピングテーブルに書き込みます。
/* Write the updated data to the mapping table for the temporary table. */
INSERT INTO mapping_holotable_temp SELECT * FROM holotable;
-- MaxCompute の元の宛先テーブルを削除します。
/* Drop the original destination table in MaxCompute. */
DROP TABLE IF EXISTS mc_holotable;
-- 一時テーブルの名前を宛先テーブルの名前に変更します。
/* Rename the temporary table as the name of the destination table. */
ALTER TABLE mc_holotable_temp RENAME TO mc_holotable;一部のフィールドまたはすべてのフィールドをインポートできます。
フィールドの一部をエクスポートします。
INSERT INTO mapping_holotable_temp SELECT x,x,x FROM holotable; --x,x,x は、エクスポートするフィールド名に置き換えることができます。 /* x,x,x can be replaced with the field names that you want to export. */すべてのフィールドをエクスポートします。
INSERT INTO mapping_holotable_temp SELECT * FROM holotable;