Hologres は、さまざまなバージョンで INSERT OVERWRITE 機能をサポートしています。Hologres V2.0 以降では、この機能は hg_insert_overwrite ストアドプロシージャを通じて利用できます。Hologres V3.1 以降では、利便性と効率性を向上させるために、ネイティブの INSERT OVERWRITE 構文もサポートされています。
機能比較
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` 構文は、テーブルタイプによって異なります:
標準テーブル (非パーティションテーブル)。
物理パーティションテーブルの子テーブル。Hologres はこれらを標準テーブルとして扱います。物理パーティションテーブルの親テーブルはサポートされていません。
論理パーティションテーブル。パーティションを指定する必要があります。
制限事項
デフォルトでは、ネイティブの INSERT OVERWRITE 構文は、
SET hg_experimental_enable_transaction = on;コマンドを使用して混合データ操作言語 (DML) トランザクションを有効にします。Hologres のトランザクション機能の詳細については、「SQL トランザクション機能」をご参照ください。同じトランザクション内で INSERT OVERWRITE 文と DDL 文を混在させることはできません。
同じトランザクション内では、COMMIT コマンドを実行してトランザクションを完了した後にのみ、すべての DML 文がコミットされます。
ネイティブの INSERT OVERWRITE 構文は、バイナリログが有効になっているテーブルのバイナリログ生成をサポートしていません。
SET hg_experimental_generate_binlog = off;コマンドを実行することで、セッションレベルでバイナリログを無効にできます。デフォルトでは、ネイティブの INSERT OVERWRITE 文の実行中にテーブルデータの読み取りの原子性が保証されます。ただし、テーブルデータの読み取りには大きなメタデータオーバーヘッドが伴い、SQL のレイテンシーが増加する可能性があります。データクエリ言語 (DQL) タスクのレイテンシーは、リーダー計算グループよりもフォロワー計算グループでより影響を受けます。ソーステーブルに対する
Insert Overwrite操作の完了に時間がかかると、テーブル読み取りタスクがData version is inconsistentまたはInsert overwrite version not matchエラーで失敗する場合があります。データ読み取りの原子性が必要ない場合は、
set hg_experimental_enable_check_data_version=offを実行して DQL タスクの GUC パラメーターを無効にできます。この場合、DQL タスクによってスキャンされるデータファイルには、INSERT OVERWRITE操作の前後のファイルが混在する可能性があります。データ読み取りの原子性を保証し、DQL のレイテンシーを削減したい場合は、リーダー計算グループのリソースを直接使用して DQL タスクを実行できます。
コマンド構文
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 | いいえ | 標準の SELECT 文。クエリ結果は target_table_name テーブルのデータを上書きします。 説明 target_table_name が論理パーティションテーブルで、partition_value が指定されている場合、指定されたパーティションに属さないクエリ結果のデータは自動的に無視されます。クエリ結果に指定されたパーティションのデータが含まれていない場合、そのパーティションはクリアされます。 |
例
ネイティブ INSERT OVERWRITE 構文を使用した非パーティションテーブルへのデータインポート
-- 結果テーブルとしてテーブル A を作成します。
CREATE TABLE public.tablea (
cid INTEGER NOT NULL,
cname TEXT,
code INTEGER
,PRIMARY KEY (cid)
);
-- データ入力用のテーブル B を作成します。
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 構文を使用して、テーブル B からテーブル A にデータを挿入します。
INSERT OVERWRITE public.tablea SELECT * FROM public.tableb;ネイティブ INSERT OVERWRITE 構文を使用した論理パーティションテーブルへのデータインポート
-- 結果テーブルとして論理パーティションテーブル A を作成します。
CREATE TABLE public.tablea(
a TEXT ,
b INT,
c TIMESTAMP,
d TEXT,
ds TEXT,
PRIMARY KEY(ds,b)
)
LOGICAL PARTITION BY LIST(ds);
-- データ入力用の物理パーティションテーブル B を作成します。
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 構文を使用して、テーブル B からテーブル A にデータを挿入します。
INSERT OVERWRITE public.tablea PARTITION (ds = '20201215') SELECT * FROM public.tableb WHERE ds='20201215';ストアドプロシージャを使用した INSERT OVERWRITE 操作の実行
機能説明
Hologres V3.1 以降では、論理パーティションテーブルがサポートされています。hg_insert_overwrite ストアドプロシージャも論理パーティションテーブルをサポートしていますが、パーティションを明示的に指定する必要があります。
Hologres V3.0 では、hg_insert_overwrite 機能が強化されています。INSERT OVERWRITE コマンドを実行して、親パーティションテーブルに直接データをインポートできます。
Hologres V2.0.15 以降では、
set hg_experimental_hg_insert_overwrite_enable_view=on;コマンドを実行して GUC パラメーターを有効にできます。これにより、ビュー依存関係を持つテーブルにデータをインポートできます。マテリアライズドビュー依存関係を持つテーブルにはデータをインポートできません。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 操作には、一時テーブルを作成するためのテーブルオーナー権限が必要です。したがって、この操作を実行できるのは、スーパーユーザーまたはテーブルオーナーのみです。
結果テーブルのパーティションキーは、INT、TEXT、または VARCHAR データ型をサポートします。
Hologres V3.0 以降では、トランザクション内で hg_insert_overwrite ストアドプロシージャを使用することはできません。使用しようとすると、エラーが報告されます。
説明以前のバージョンでは、トランザクション内で hg_insert_overwrite ストアドプロシージャを使用すると、特定のシナリオでデッドロックやハングなどの問題が発生する可能性がありました。後のバージョンでは、これを防ぐために、より厳格なルールが適用されています。
Hologres V3.0 以降では、hg_insert_overwrite ストアドプロシージャの select_query で指定された列の数とデータ型は、target_table の列と完全に一致する必要があります。そうでない場合、
"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 ストアドプロシージャには以下の動作変更があります:
target_table と select_query パラメーターのみを提供し、結果テーブルが親パーティションテーブルである場合、Hologres V3.0 より前のバージョンではエラーが報告されます。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 に変更されました。これにより、物理的な親パーティションテーブルにデータを書き込み、複数の物理的な子パーティションを指定できます。partition_value パラメーターには引き続き TEXT データ型を使用できますが、1 つの物理的な子パーティションにしかデータを書き込めません。
パラメータ | 説明 |
target_table | Hologres の内部テーブル。 これはデータが格納される結果テーブルです。テーブルはすでに存在している必要があります。 |
partition_value | パーティションテーブルのパーティションキーの値。
|
sql | 標準 SELECT 文。 これを使用して、MaxCompute または Hologres のテーブルをクエリできます。SELECT 文によって返されるパーティションフィールド値が
|
auto_create_partition | パーティションを自動的に作成するかどうかを指定します。このパラメーターは V3.0 以降でのみサポートされ、物理パーティションテーブルにのみ適用されます。このパラメーターは論理パーティションテーブルでは無視されます。
|
V3.0 以降、target_table が親パーティションテーブルである親パーティションテーブルに対する INSERT OVERWRITE 操作の動作は、パラメーター設定によって異なります。
物理パーティションテーブル
パラメーター値
auto_create_partition
TRUE
FALSE
partition_value
指定なし
sqlの実行結果に対応するすべてのtarget_tableパーティションが上書きされます。子パーティションが存在しない場合は、最初に自動的に作成されます。sqlの実行結果に関係のないtarget_tableパーティションは無視されます。
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 非パーティションテーブルにデータをインポートする
-- 結果テーブルとしてテーブル A を作成します。
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;
-- データ入力用のテーブル B を作成します。
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 を使用して、テーブル B からテーブル A にデータを挿入します。
CALL hg_insert_overwrite('public.tablea' , 'SELECT * FROM public.tableb');例 2:ストアドプロシージャを使用して Hologres 内部テーブルから Hologres パーティションテーブル (物理または論理) にデータをインポートする
-- 結果テーブルとしてテーブル A を作成します。
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);
-- データ入力用のテーブル B を作成します。
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 で非パーティションテーブルを作成します。この例では、MaxCompute の公開データセットである public_data プロジェクトの 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);
-- Hologres で外部テーブルを作成し、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');
-- Hologres で内部テーブル (列指向テーブルなど) を作成し、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;
-- 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 にデータをインポートする前に一定期間待機します。これにより、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')
;
-- パーティションにデータを書き込みます。
INSERT OVERWRITE TABLE odps_sale_detail PARTITION(sale_date='20210815') VALUES
('s1','c1',100.1),
('s2','c2',100.2),
('s3','c3',100.3)
;
-- Hologres で外部テーブルを作成し、MaxCompute のソースデータテーブルにマッピングします。
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');
-- Hologres で内部テーブルを作成し、MaxCompute ソーステーブルからデータを受け取ります。
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)
;
-- Hologres で外部テーブルを作成し、MaxCompute のソースデータテーブルにマッピングします。
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');
-- Hologres で内部テーブルを作成し、MaxCompute ソーステーブルからデータを受け取ります。
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 文 | 一時テーブルは、以下の 2 つの方法のいずれかで作成できます:
|
例
MaxCompute から Hologres の非パーティションテーブルへのデータインポート
MaxCompute から Hologres にデータをインポートする際、既存のすべてのデータを上書きする必要がある場合があります。これは、オフライン処理からオンラインサービステーブルに結果テーブルをエクスポートする一般的なシナリオです。次の例は、MaxCompute の odps_region_10g テーブルから Hologres の region テーブルにデータを書き込み、region テーブルのすべてのデータを上書きする方法を示しています。
BEGIN ;
-- 潜在的な一時テーブルをクリアします。
DROP TABLE IF EXISTS public.region_new;
-- 一時テーブルを作成します。
SET hg_experimental_enable_create_table_like_properties=on;
CALL HG_CREATE_TABLE_LIKE ('public.region_new', 'select * from public.region');
COMMIT ;
-- 一時テーブルにデータを挿入します。
INSERT INTO public.region_new
SELECT *
FROM public.odps_region_10g;
ANALYZE public.region_new;
BEGIN ;
-- 古いテーブルを削除します。
DROP TABLE IF EXISTS public.region;
-- 一時テーブルの名前を変更します。
ALTER TABLE IF EXISTS public.region_new RENAME TO region;
COMMIT ;MaxCompute から Hologres のパーティションテーブルへのデータインポート
MaxCompute パーティションテーブルを毎日定期的に更新し、そのデータを Hologres パーティションテーブルにインポートする必要があるシナリオでは、オフラインデータでリアルタイムデータを修正するために、既存のすべてのデータを上書きしたい場合があります。次の例は、MaxCompute の odps_lineitem_10g テーブルから Hologres の lineitem テーブルにデータを書き込み、lineitem テーブルのすべてのデータを上書きする方法を示しています。両方のテーブルは、ds フィールドに基づいて日次でパーティション分割されています。
BEGIN ;
-- 潜在的な一時テーブルをクリアします。
DROP TABLE IF EXISTS public.lineitem_new_20210101;
-- 一時テーブルを作成します。
SET hg_experimental_enable_create_table_like_properties=on;
CALL HG_CREATE_TABLE_LIKE ('public.lineitem_new_20210101', 'select * from public.lineitem');
COMMIT ;
-- 一時テーブルにデータを挿入します。
INSERT INTO public.lineitem_new_20210101
SELECT *
FROM public.odps_lineitem_10g
WHERE DS = '20210101'
ANALYZE public.lineitem_new_20210101;
BEGIN ;
-- 古いパーティションを削除します。
DROP TABLE IF EXISTS public.lineitem_20210101;
-- 一時テーブルの名前を変更します。
ALTER TABLE public.lineitem_new_20210101 RENAME TO lineitem_20210101;
-- 指定されたパーティションテーブルに一時テーブルをアタッチします。
ALTER TABLE public.lineitem ATTACH PARTITION lineitem_20210101 FOR VALUES IN ('20210101');
COMMIT ;Hologres から MaxCompute の非パーティションテーブルへのデータインポート
Hologres から MaxCompute の非パーティションテーブルにデータをインポートするには、一時テーブルを使用できます。インポートが完了したら、一時テーブルの名前を標準テーブルに変更できます。次の例では、Hologres の holotable テーブルから MaxCompute の mc_holotable テーブルにデータを書き込み、mc_holotable テーブルのすべてのデータを上書きする方法を示します。
-- MaxCompute で結果テーブル用の一時テーブルを作成します。
CREATE TABLE if not exists mc_holotable_temp(
age INT,
job STRING,
name STRING
);
-- 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 holotable SET "job" = 'president' WHERE "name" = 'Lily';
-- 更新されたデータを一時テーブルのマッピングに書き込みます。
INSERT INTO mapping_holotable_temp SELECT * FROM holotable;
-- MaxCompute の古い結果テーブルを削除します。
DROP TABLE IF EXISTS mc_holotable;
-- 一時テーブルの名前を結果テーブルに変更します。
ALTER TABLE mc_holotable_temp RENAME TO mc_holotable;フィールドの一部またはすべてをインポートできます:
一部のフィールドをエクスポートする例:
INSERT INTO mapping_holotable_temp SELECT x,x,x FROM holotable; -- x,x,x を、エクスポートするフィールド名に置き換えることができます。すべてのフィールドをエクスポートする例:
INSERT INTO mapping_holotable_temp SELECT * FROM holotable;