このトピックでは、COPYステートメントを使用してObject Storage Service (OSS) 外部テーブルからAnalyticDB for PostgreSQLテーブルにデータをインポートし、UNLOADステートメントを使用してAnalyticDB for PostgreSQLテーブルからOSS外部テーブルにデータをエクスポートする方法について説明します。
COPYまたはUNLOADステートメントは、OSS外部テーブルに基づいてデータをインポートまたはエクスポートするために使用されます。 詳細については、「OSS外部テーブルを使用したOSSデータへのアクセス」をご参照ください。
COPY
構文
COPY <table_name>
[ <column_list> ]
FROM <data_source>
ACCESS_KEY_ID '<access_key_id>'
SECRET_ACCESS_KEY '<secret_access_key>'
[ [ FORMAT ] [ AS ] <data_format> ]
[ MANIFEST ]
[ option '<value>' [ ... ] ]
Parameters
パラメーター | 必須 | 説明 |
table_name | 継続する | インポートされたデータが格納されるAnalyticDB for PostgreSQLテーブルの名前。 AnalyticDB for PostgreSQLテーブルは、AnalyticDB for PostgreSQLインスタンスに存在する必要があります。 |
column_list | 継続しない | データを書き込む列のリスト。 このパラメーターを指定しないと、すべての列にデータが書き込まれます。 |
data_source | 継続する | データを取得するOSSバケットのURL。 例: oss://<bucket_name>/path_prefix |
access_key_id | 継続する | OSSにアクセスする権限を持つAlibaba CloudアカウントまたはRAM (Resource Access Management) ユーザーのAccessKey ID。 AccessKey IDの取得方法については、「AccessKeyペアの取得」をご参照ください。 |
secret_access_key | 継続する | OSSにアクセスする権限を持つAlibaba CloudアカウントまたはRAMユーザーのAccessKeyシークレット。 AccessKeyシークレットの取得方法については、「AccessKeyペアの取得」をご参照ください。 |
[フォーマット] [ AS ] <data_format> | 継続しない | インポートされたデータが保存されるファイル形式。 このパラメーターを指定しない場合、FORMAT AS CSVが使用されます。
|
マニフェスト | 継続しない | データソースはマニフェストファイルです。 マニフェストファイルはJSON形式で、次の要素で構成されている必要があります。
|
[option '<value>' [ ... ] ] | 継続しない | オプションのリスト。 各オプションを |
オプション
オプション | データ型 | 必須 | 説明 |
エンドポイント | STRING | 継続する | OSSエンドポイント。 OSSエンドポイントの取得方法については、「リージョンとエンドポイント」をご参照ください。 |
FDW | STRING | 継続する | oss_fdw拡張子の名前。 COPYステートメントの一時的なOSSサーバーを作成する場合は、oss_fdw拡張子が必要です。 |
FORMAT、FILETYPE、DELIMITER、ESCAPEなど、OSS外部テーブルの作成に使用されるその他のオプション | 非該当 | 非該当 | 一時的なOSS外部テーブルの作成に使用されるオプション。 詳細については、「OSS外部テーブルの概要」をご参照ください。 |
例
例 1
AnalyticDB for PostgreSQLテーブルを作成します。
CREATE TABLE local_t2 (a int, b float8, c text);
COPYステートメントを使用して、列aとcにデータをインポートします。 列bにはNULLが割り当てられる。
COPY local_t2 (a, c) FROM 'oss://adbpg-regress/local_t/' ACCESS_KEY_ID 'LTAI5tDfyHVmxCf66Un****' SECRET_ACCESS_KEY 'TNPPxOFY4xx7CZGjVgSsVBtIs****' FORMAT AS CSV ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com' FDW 'oss_fdw';
テーブルのデータを照会します。
SELECT * FROM local_t2 LIMIT 10;
サンプル結果:
a | b | c ----+---+---------------------------------- 12 | | a24cba6ebdc5e0c485cd88ef60b72fea 15 | | c4d3028f5205fab98e5f43c7945db4ba 20 | | 769884311db01f400e21a903a3f1cb50 26 | | 7d12c981d262e0067ea1a04368f32f2a 30 | | 4e64bda52d54d263d16f42771b1d0225 35 | | b70c976d4c04568bd497b42a7d2e451d 40 | | d07ce2948b8618b47c351b6e222182f6 46 | | c2234393f878f5557776b7e778299564 47 | | cde904b2331fa274cd8d9266aa858342 50 | | 1235b900fb644bb36440a274314e4b6b (10 rows)
local_t2テーブルの列aと列cのデータがlocal_tテーブルのデータと同じかどうかを確認します。
SELECT sum(hashtext(t.a::text)) AS col_a_hash, sum(hashtext(t.c::text)) AS col_c_hash FROM local_t2 t;
サンプル結果:
col_a_hash | col_c_hash -------------+------------- 23725368368 | 13447976580 (1 row)
SELECT sum(hashtext(t.a::text)) AS col_a_hash, sum(hashtext(t.c::text)) AS col_c_hash FROM local_t t;
サンプル結果:
col_a_hash | col_c_hash -------------+------------- 23725368368 | 13447976580 (1 row)
CSV以外の形式でデータを保存します。
データをORC形式で保存します。
COPY tt FROM 'oss://adbpg-regress/q_oss_orc_list/' ACCESS_KEY_ID 'LTAI5tDfyHVmxCf66Un****' SECRET_ACCESS_KEY 'TNPPxOFY4xx7CZGjVgSsVBtIs****' FORMAT AS ORC ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com' FDW 'oss_fdw';
データをPARQUET形式で保存します。
COPY tp FROM 'oss://adbpg-regress/test_parquet/' ACCESS_KEY_ID 'LTAI5tDfyHVmxCf66Un****' SECRET_ACCESS_KEY 'TNPPxOFY4xx7CZGjVgSsVBtIs****' FORMAT AS PARQUET ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com' FDW 'oss_fdw';
例 2
AnalyticDB for PostgreSQLテーブルを作成します。
CREATE TABLE local_manifest (a int, c text);
OSSオブジェクトを異なるバケットに配置できるマニフェストファイルを作成します。
{ "entries": [ {"url": "oss://adbpg-regress/local_t/_20210114103840_83f407434beccbd4eb2a0ce45ef39568_1450404435_seg2_0.csv", "mandatory":true}, {"url": "oss://adbpg-regress/local_t/_20210114103840_83f407434beccbd4eb2a0ce45ef39568_1856683967_seg1_0.csv", "mandatory":true}, {"url": "oss://adbpg-regress/local_t/_20210114103840_83f407434beccbd4eb2a0ce45ef39568_1880804901_seg0_0.csv", "mandatory":true}, {"url": "oss://adbpg-regress-2/local_t/_20210114103849_67100080728ef95228e662bc02cb99d1_1008521914_seg1_0.csv", "mandatory":true}, {"url": "oss://adbpg-regress-2/local_t/_20210114103849_67100080728ef95228e662bc02cb99d1_1234881553_seg2_0.csv", "mandatory":true}, {"url": "oss://adbpg-regress-2/local_t/_20210114103849_67100080728ef95228e662bc02cb99d1_1711667760_seg0_0.csv", "mandatory":true} ] }
COPYステートメントを使用して、マニフェストファイルからAnalyticDB for PostgreSQLテーブルにデータをインポートします。
COPY local_manifest FROM 'oss://adbpg-regress-2/unload_manifest/t_manifest' ACCESS_KEY_ID 'LTAI5tDfyHVmxCf66Un****' SECRET_ACCESS_KEY 'TNPPxOFY4xx7CZGjVgSsVBtIs****' FORMAT AS CSV MANIFEST -- The data source is a manifest file. ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com' FDW 'oss_fdw';
例3
COPYステートメントを使用してOSSからデータをインポートすると、エラー行が返される場合があります。 この場合、次のオプションを設定してフォールトトレランスを実装できます。
log_errors: エラー行の情報をログファイルに記録するかどうかを指定します。
segment_reject_limit:
segment_reject_limit '10'
は、エラー行数が10以上の場合、エラーを返して終了します。segment_reject_limit '10% '
は、エラー行の割合が10% 以上の場合、システムはエラーを返して終了します。
AnalyticDB for PostgreSQLテーブルを作成します。
CREATE TABLE sales(id integer, value float8, x text) DISTRIBUTED BY (id);
COPYステートメントを使用して、3つのエラー行があるOSSオブジェクトからデータをインポートします。
COPY sales FROM 'oss://adbpg-const/error_sales/' ACCESS_KEY_ID 'LTAI5tDfyHVmxCf66Un****' SECRET_ACCESS_KEY 'TNPPxOFY4xx7CZGjVgSsVBtIs****' FORMAT AS csv log_errors 'true' segment_reject_limit '10' endpoint 'oss-cn-hangzhou-internal.aliyuncs.com' FDW 'oss_fdw'; NOTICE: found 3 data formatting errors (3 or more input rows), rejected related input data COPY FOREIGN TABLE
次のステートメントを実行して、エラー行の詳細を照会します。
SELECT * FROM gp_read_error_log('<Name of the destination table of the COPY statement>');
次の例では、salesテーブルのエラー行の詳細が照会されます。
SELECT * FROM gp_read_error_log('sales');
サンプル結果:
cmdtime | relname | filename | linenum | bytenum | errmsg | rawdata | rawbytes -------------------------------+------------------------------------------------+-------------------------+---------+---------+-----------------------------------------------------------+---------+---------- 2021-02-08 14:24:04.225238+08 | adbpgforeigntabletmp_20210208142403_1936866966 | error_sales/sales.2.csv | 2 | | invalid byte sequence for encoding "UTF8": 0xed 0xab 0xad | | \x 2021-02-08 14:24:04.225238+08 | adbpgforeigntabletmp_20210208142403_1936866966 | error_sales/sales.2.csv | 3 | | invalid byte sequence for encoding "UTF8": 0xed 0xab 0xad | | \x 2021-02-08 14:24:04.225269+08 | adbpgforeigntabletmp_20210208142403_1936866966 | error_sales/sales.3.csv | 2 | | invalid byte sequence for encoding "UTF8": 0xed 0xab 0xad | | \x (3 rows)
説明追加保存されたエラー行ログはストレージスペースを占有します。 次の構文を使用して、エラー行ログを削除できます。
SELECT gp_truncate_error_log('<table_name>')
アンロード
使用上の注意
データをCSVファイルにエクスポートする場合は、オプションを引用符 (") で囲み、オプションを小文字で記述する必要があります。 この要件に従わない場合、一部のオプションがキーワードとして処理されることがあります。 これにより、構文エラーが発生する可能性があります。 delimiter
、quote
、null
、header
、escape
、encoding
というオプションを特定の方法で指定する必要があります。 例:
UNLOAD ('SELECT * FROM test')
TO 'oss://adbpg-regress/local_t/'
ACCESS_KEY_ID 'LTAI5tDfyHVmxCf66Un****'
SECRET_ACCESS_KEY 'TNPPxOFY4xx7CZGjVgSsVBtIs****'
FORMAT csv
"delimiter" '|'
"quote" '"'
"null" ''
"header" 'true'
"escape" 'E'
"encoding" 'utf-8'
FDW 'oss_fdw'
ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com';
構文
UNLOAD ('<select_statement>')
TO <destination_url>
ACCESS_KEY_ID '<access_key_id>'
SECRET_ACCESS_KEY '<secret_access_key>'
[ [ FORMAT ] [ AS ] <data_format> ]
[ MANIFEST [ '<manifest_url>' ] ]
[ PARALLEL [ { ON | TRUE } | { OFF | FALSE } ] ]
[ option '<value>' [ ... ] ]
Parameters
パラメーター | 必須 | 説明 |
select_statement | 継続する | SELECTステートメント。 クエリ結果データがOSSに書き込まれます。 |
destination_url | 継続する | データを取得するOSSバケットのURL。 例: oss://<bucket_name>/path_prefix |
access_key_id | 継続する | OSSにアクセスする権限を持つAlibaba CloudアカウントまたはRAM (Resource Access Management) ユーザーのAccessKey ID。 AccessKey IDの取得方法については、「AccessKeyペアの取得」をご参照ください。 |
secret_access_key | 継続する | OSSにアクセスする権限を持つAlibaba CloudアカウントまたはRAMユーザーのAccessKeyシークレット。 AccessKeyシークレットの取得方法については、「AccessKeyペアの取得」をご参照ください。 |
[フォーマット] [ AS ] <data_format> | 継続しない | エクスポートされたデータが保存されるファイル形式。 このパラメーターを指定しない場合、FORMAT AS CSVが使用されます。
|
マニフェスト | 継続しない | データのエクスポート時にマニフェストファイルを生成します。 説明
|
PARALLEL | 継続しない | 複数の計算ノードからデータを並列にエクスポートするかどうかを指定します。 デフォルトでは、データは複数の計算ノードから並列にエクスポートされます。 計算ノードごとに、個別のエクスポートファイルが生成されます。 このパラメーターをOFFまたはFALSEに設定すると、データは並行してエクスポートされません。 エクスポートされたデータのサイズが8 GBを超えない場合、エクスポートされたデータは1つのファイルに保存されます。 |
[option '<value>' [ ... ] ] | 継続しない | オプションのリスト。 各オプションを |
オプション
オプション | データ型 | 必須 | 説明 |
エンドポイント | STRING | 継続する | OSSエンドポイント。 OSSエンドポイントの取得方法については、「リージョンとエンドポイント」をご参照ください。 |
FDW | STRING | 継続する | oss_fdw拡張子の名前。 COPYステートメントの一時的なOSSサーバーを作成する場合は、oss_fdw拡張子が必要です。 |
FORMAT、FILETYPE、DELIMITER、ESCAPEなど、OSS外部テーブルの作成に使用されるその他のオプション | 非該当 | 非該当 | 一時的なOSS外部テーブルの作成に使用されるオプション。 詳細については、「OSS外部テーブルの概要」をご参照ください。 |
例
例 1
AnalyticDB for PostgreSQLテーブルを作成し、テーブルにテストデータを挿入します。
AnalyticDB for PostgreSQLテーブルのクエリデータ。
SELECT * FROM local_t LIMIT 5;
サンプル結果:
UNLOADステートメントを使用して、AnalyticDB for PostgreSQLテーブルの指定された列からOSSにデータをエクスポートし、CSV形式でデータを保存します。
指定したパスにCSVファイルが書き込まれているか確認してください。
$ ossutil --config hangzhou-zmf.config ls oss://adbpg-regress/local_t/
サンプル結果:
local_t表のa列とc列のデータのみがCSVファイルに含まれているかどうかを確認してください。
$ head -n 10 adbpgforeigntabletmp_20200907164801_1354519958_20200907164801_652261618_seg2_0.csv
サンプル結果:
CREATE TABLE local_t (a int, b float8, c text);
INSERT INTO local_t SELECT r, random() * 1000, md5(random()::text) FROM generate_series(1,1000)r;
a | b | c
----+------------------+----------------------------------
5 | 550.81393988803 | 8009fa725372e996786849213a695ce0
6 | 95.8335199393332 | ce7952c6728cdffdee06cc5b502d6457
9 | 421.379795763642 | d3260ccbf6b9c03f3658d96bb7678b4d
10 | 362.347379792482 | 2bbbf89d23a2f83b089b589f55b5c4fc
11 | 800.203878898174 | a52994c5573e6b36d8a1c357bf800ce5
(5 rows)
UNLOAD ('select a, c from local_t') TO 'oss://adbpg-regress/local_t/'
ACCESS_KEY_ID 'LTAI5tDfyHVmxCf66Un****'
SECRET_ACCESS_KEY 'TNPPxOFY4xx7CZGjVgSsVBtIs****'
FORMAT AS CSV
ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com'
FDW 'oss_fdw';
NOTICE: OSS output prefix: "local_t/adbpgforeigntabletmp_20200907164801_1354519958_20200907164801_652261618".
UNLOAD
LastModifiedTime Size(B) StorageClass ETAG ObjectName
2020-09-07 16:48:01 +0800 CST 12023 Standard 9F38B5407142C044C1F3555F00000000 oss://adbpg-regress/local_t/adbpgforeigntabletmp_20200907164801_1354519958_20200907164801_652261618_seg0_0.csv
2020-09-07 16:48:01 +0800 CST 12469 Standard 807BA680A0DED49BC1F3555F00000000 oss://adbpg-regress/local_t/adbpgforeigntabletmp_20200907164801_1354519958_20200907164801_652261618_seg1_0.csv
2020-09-07 16:48:01 +0800 CST 12401 Standard 3524F68F628CEB64C1F3555F00000000 oss://adbpg-regress/local_t/adbpgforeigntabletmp_20200907164801_1354519958_20200907164801_652261618_seg2_0.csv
Object Number is: 3
0.153414(s) elapsed
7,1225341d0d367a69b1b345536b21ef73
19,424a7a5c36066842f4de8c8a8341fc89
27,c214432e9928e4a6f7bef7bd815424c0
29,ade5d636e2b5d2a606a02e79255da4bd
37,85660e60ede47b68493f6295620db568
77,e1be448ba2b08f0a2ca05b7ed812abfd
80,5e85d597a3b0f2f9736a728724a0f9e0
92,dc23f76f0b1446504b8f1c2274521d2f
94,50304822488d55a500e3a71bcf40890f
97,e970fde8cd0df9c6b610925a488f6042
例 2
UNLOADステートメントを使用して、データをエクスポートし、マニフェストファイルを生成します。 マニフェストファイルのパスプレフィックスは、データファイルのパスプレフィックスと同じです。
エクスポートされたファイルの一覧を表示します。
ossutil ls -s oss://adbpg-regress/local_t/
リストには、いくつかのデータファイルとマニフェストファイルが含まれます。 サンプル結果:
マニフェストファイルの内容を表示します。
ossutil cat oss://adbpg-regress/local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c_manifest
サンプル結果:
UNLOADステートメントを使用して、データをエクスポートし、指定されたマニフェストファイルを生成します。 マニフェストファイルのパスは、データファイルのパスと異なっていてもよい。
エクスポートされたファイルの一覧を表示します。
ossutil ls -s oss://adbpg-regress/local_t/
データファイルのみがリストに含まれています。 サンプル結果:
データファイルとは別のバケットに保存されているマニフェストファイルのコンテンツを表示します。
ossutil cat oss://adbpg-regress-2/unload_manifest/t_manifest
サンプル結果:
UNLOAD ('select * from local_t') TO 'oss://adbpg-regress/local_t/'
ACCESS_KEY_ID 'LTAI5tDfyHVmxCf66Un****'
SECRET_ACCESS_KEY 'TNPPxOFY4xx7CZGjVgSsVBtIs****'
FORMAT AS CSV
MANIFEST -- Generate a manifest file when the UNLOAD statement is used to export data. The path prefix of the manifest file is the same as that of the data files.
ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com'
FDW 'oss_fdw';
NOTICE: OSS output prefix: "local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c".
UNLOAD
oss://adbpg-regress/local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c_162488956_seg1_0.csv
oss://adbpg-regress/local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c_163756258_seg0_0.csv
oss://adbpg-regress/local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c_1741120517_seg2_0.csv
oss://adbpg-regress/local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c_manifest
Object Number is: 4
0.136180(s) elapsed
{
"entries": [
{"url": "oss://adbpg-regress/local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c_162488956_seg1_0.csv"},
{"url": "oss://adbpg-regress/local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c_163756258_seg0_0.csv"},
{"url": "oss://adbpg-regress/local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c_1741120517_seg2_0.csv"}
]
}
ALLOWOVERWRITEオプションをtrueに設定すると、既存のマニフェストファイルが上書きされます。 ただし、データファイルは上書きされません。 データファイルは手動で削除できます。
UNLOAD ('select * from local_t') TO 'oss://adbpg-regress/local_t/'
ACCESS_KEY_ID 'LTAI5tDfyHVmxCf66Un****'
SECRET_ACCESS_KEY 'TNPPxOFY4xx7CZGjVgSsVBtIs****'
FORMAT AS CSV
MANIFEST 'oss://adbpg-regress-2/unload_manifest/t_manifest' -- Generate a specified manifest file when the UNLOAD statement is used to export data.
ALLOWOVERWRITE 'true' -- Overwrite the existing manifest file.
ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com'
FDW 'oss_fdw';
NOTICE: OSS output prefix: "local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c".
UNLOAD
oss://adbpg-regress/local_t/_20210114100956_4d3395a9501f6e22da724a2b6df1b6d3_1736161168_seg0_0.csv
oss://adbpg-regress/local_t/_20210114100956_4d3395a9501f6e22da724a2b6df1b6d3_1925769064_seg2_0.csv
oss://adbpg-regress/local_t/_20210114100956_4d3395a9501f6e22da724a2b6df1b6d3_644328153_seg1_0.csv
Object Number is: 3
0.118540(s) elapsed
{
"entries": [
{"url": "oss://adbpg-regress/local_t/_20210114100956_4d3395a9501f6e22da724a2b6df1b6d3_1736161168_seg0_0.csv"},
{"url": "oss://adbpg-regress/local_t/_20210114100956_4d3395a9501f6e22da724a2b6df1b6d3_1925769064_seg2_0.csv"},
{"url": "oss://adbpg-regress/local_t/_20210114100956_4d3395a9501f6e22da724a2b6df1b6d3_644328153_seg1_0.csv"}
]
}
よくある質問
Q: データのエクスポート時に複数のCSVファイルが生成されました。 これはなぜですか。
A: UNLOADステートメントを使用してAnalyticDB for PostgreSQLからOSSにデータをエクスポートすると、コンピュートノードごとに1つのCSVファイルが生成されます。 たとえば、インスタンスに4つの計算ノードがある場合、4つのCSVファイルが生成されます。