すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:COPY または UNLOAD コマンドを使用した OSS へのデータのインポートまたはエクスポート

最終更新日:Mar 28, 2026

COPY は Object Storage Service (OSS) から AnalyticDB for PostgreSQL テーブルにデータをインポートします。UNLOAD は AnalyticDB for PostgreSQL テーブルから OSS にクエリ結果をエクスポートします。どちらの文も OSS 外部テーブルを介して操作します。背景情報については、「OSS 外部テーブルを使用した OSS データへのアクセス」をご参照ください。

前提条件

開始する前に、以下をご確認ください:

  • AnalyticDB for PostgreSQL インスタンス

  • ご利用の AccessKey 認証情報でアクセス可能な OSS バケット

  • インスタンスにインストール済みの oss_fdw 拡張

COPY

COPY 文を使用して、OSS バケットのパスまたはマニフェストファイルから AnalyticDB for PostgreSQL テーブルにデータをインポートします。

構文

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>' [ ... ] ]

パラメーター

パラメーター必須説明
table_nameはいターゲットの AnalyticDB for PostgreSQL テーブル。このテーブルはインスタンス内にすでに存在している必要があります。
column_listいいえデータを書き込む列。省略した場合、すべての列にデータが書き込まれます。
data_sourceはい読み取り元の OSS パス。フォーマット:oss://<bucket_name>/path_prefix
access_key_idはいOSS へのアクセス権を持つ Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ID。ルートアカウントの認証情報ではなく、最小限の権限を持つ RAM ユーザーを使用してください。手順については、「AccessKey ペアの取得」をご参照ください。
secret_access_keyはいAccessKey ID に対応する AccessKey Secret です。手順については、「AccessKey ペアの取得」をご参照ください。
[ FORMAT ] [ AS ] <data_format>いいえソースデータのフォーマット。デフォルトは CSV です。サポートされている値:BINARY、CSV、JSON、JSONLINE、ORC、PARQUET、TEXT。FORMAT AS CSVFORMAT CSV、および CSV は同等です。
MANIFESTいいえdata_source をデータパスではなくマニフェストファイルとして扱います。下記の「MANIFEST ファイル形式」をご参照ください。
option 'value'いいえkey value 形式の追加オプション。下記のオプション表をご参照ください。

オプション

オプションタイプ必須説明
ENDPOINTSTRINGはいOSS エンドポイント。リージョンごとのエンドポイントのリストについては、「リージョンとエンドポイント」をご参照ください。
FDWSTRINGはいoss_fdw 拡張の名前。COPY 文のための一時的な OSS サーバーを作成するために必要です。
FORMATFILETYPEDELIMITERESCAPE、その他一時的な OSS 外部テーブルを作成するためのオプション。詳細については、「OSS 外部テーブルの概要」をご参照ください。

MANIFEST ファイル形式

MANIFEST が指定されている場合、data_source は以下の構造を持つ JSON ファイルを指す必要があります:

{
  "entries": [
    {"url": "oss://adbpg-regress/local_t/_seg2_0.csv", "mandatory": true},
    {"url": "oss://adbpg-regress/local_t/_seg1_0.csv", "mandatory": true},
    {"url": "oss://adbpg-regress/local_t/_seg0_0.csv", "mandatory": true},
    {"url": "oss://adbpg-regress-2/local_t/_seg1_0.csv", "mandatory": true},
    {"url": "oss://adbpg-regress-2/local_t/_seg2_0.csv", "mandatory": true},
    {"url": "oss://adbpg-regress-2/local_t/_seg0_0.csv", "mandatory": true}
  ]
}
フィールド説明
entriesOSS オブジェクトの配列。オブジェクトは異なるバケットやパスにまたがることができますが、すべて同じ AccessKey ID とシークレットでアクセス可能である必要があります。
urlOSS オブジェクトの完全なパス。
mandatorytrue の場合、オブジェクトが見つからないとインポートは失敗します。

フォールトトレランス

データをインポートする際、一部の行の解析に失敗することがあります。インポート全体を中止せずにエラーを処理するには、以下のオプションを設定します:

オプション説明
log_errors 'true'不正な形式の行をすぐに失敗させるのではなく、エラーログに記録します。
segment_reject_limit '<n>'拒否された行数が n (例:'10') に達した場合、または拒否率が n% (例:'10%') に達した場合、インポートを停止してエラーを返します。予測可能なエラーバジェットにはカウントのしきい値を使用し、絶対数を推測するのが難しい可変サイズのデータセットにはパーセンテージのしきい値を使用します。

インポート後、エラーログをクエリします:

SELECT * FROM gp_read_error_log('<table_name>');
エラーログはストレージ容量を消費します。不要になったら削除してください:
SELECT gp_truncate_error_log('<table_name>');

CSV からの特定列のインポート

  1. ターゲットテーブルを作成します。

    CREATE TABLE local_t2 (a int, b float8, c text);
  2. ac にデータをインポートします。列 b には NULL が入ります。

    COPY local_t2 (a, c)
    FROM 'oss://adbpg-regress/local_t/'
    ACCESS_KEY_ID 'LTAI****************'
    SECRET_ACCESS_KEY 'TNPP*************************'
    FORMAT AS CSV
    ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com'
    FDW 'oss_fdw';
  3. インポートを検証します。

    SELECT * FROM local_t2 LIMIT 10;

    期待される出力:

     a  | b |                c
    ----+---+----------------------------------
      12 |   | a24cba6ebdc5e0c485cd88ef60b72fea
      15 |   | c4d3028f5205fab98e5f43c7945db4ba
      20 |   | 769884311db01f400e21a903a3f1cb50
    ...
    (10 rows)
  4. local_t2 テーブルの列 ac のデータが 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)
  5. 異なる FORMAT を使用して、同じ構文で ORC または Parquet ファイルをインポートします:

    -- ORC
    COPY tt
    FROM 'oss://adbpg-regress/q_oss_orc_list/'
    ACCESS_KEY_ID 'LTAI****************'
    SECRET_ACCESS_KEY 'TNPP*************************'
    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 'LTAI****************'
    SECRET_ACCESS_KEY 'TNPP*************************'
    FORMAT AS PARQUET
    ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com'
    FDW 'oss_fdw';

マニフェストファイルからのインポート

  1. ターゲットテーブルを作成します。

    CREATE TABLE local_manifest (a int, c text);
  2. 複数のバケットからのオブジェクトを参照するマニフェストファイルを作成します。

    {
      "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}
      ]
    }
  3. マニフェストファイルのパスを使用してインポートします。

    COPY local_manifest
    FROM 'oss://adbpg-regress-2/unload_manifest/t_manifest'
    ACCESS_KEY_ID 'LTAI****************'
    SECRET_ACCESS_KEY 'TNPP*************************'
    FORMAT AS CSV
    MANIFEST
    ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com'
    FDW 'oss_fdw';

フォールトトレランスによるインポートエラーの処理

  1. ターゲットテーブルを作成します。

    CREATE TABLE sales (id integer, value float8, x text) DISTRIBUTED BY (id);
  2. エラーログを有効にしてインポートします。行が失敗してもインポートは続行されますが、10 個以上のエラーが見つかると停止します。

    COPY sales
    FROM 'oss://adbpg-const/error_sales/'
    ACCESS_KEY_ID 'LTAI****************'
    SECRET_ACCESS_KEY 'TNPP*************************'
    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
  3. エラーの詳細をクエリします。

    SELECT * FROM gp_read_error_log('sales');

    期待される出力:

             cmdtime            |                    relname                     |        filename         | linenum | bytenum |                          errmsg                           | rawdata | rawbytes
    ----------------------------+------------------------------------------------+-------------------------+---------+---------+-----------------------------------------------------------+---------+----------
     2021-02-08 14:24:04.225238 | 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 | 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 | adbpgforeigntabletmp_20210208142403_1936866966 | error_sales/sales.3.csv |       2 |         | invalid byte sequence for encoding "UTF8": 0xed 0xab 0xad |         | \x
    (3 rows)

UNLOAD

UNLOAD 文を使用して、AnalyticDB for PostgreSQL テーブルから OSS にクエリ結果をエクスポートします。

注意事項

CSV にエクスポートする場合、次のオプション (delimiterquotenullheaderescape、および encoding) は二重引用符で囲み、小文字で記述してください。引用符がない場合、これらのオプション名は SQL キーワードとして解釈され、構文エラーが発生する可能性があります。

UNLOAD ('SELECT * FROM test')
TO 'oss://adbpg-regress/local_t/'
ACCESS_KEY_ID 'LTAI****************'
SECRET_ACCESS_KEY 'TNPP*************************'
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>' [ ... ] ]

パラメーター

パラメーター必須説明
select_statementはい結果が OSS に書き込まれる SELECT 文。
destination_urlはい書き込み先の OSS パス。フォーマット:oss://<bucket_name>/path_prefix
access_key_idはいOSS にアクセスできる Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID です。ルートアカウントの認証情報を使用する代わりに、必要な最小限の権限を付与した RAM ユーザーを使用してください。手順については、「AccessKey ペアの取得」をご参照ください。
secret_access_keyはいAccessKey ID に対応する AccessKey Secret です。手順については、「AccessKey ペアの取得」をご参照ください。
[ FORMAT ] [ AS ] <data_format>いいえエクスポートされるデータのフォーマット。デフォルトは CSV です。サポートされている値:CSV、ORC、TEXT。
MANIFEST [ '<manifest_url>' ]いいえエクスポートされたすべてのオブジェクトをリストしたマニフェストファイルを生成します。manifest_url が指定されている場合、マニフェストはそのパス (manifest サフィックスで終わる必要があります) に書き込まれ、データファイルとは異なるバケットに配置できます。省略した場合、マニフェストのパスプレフィックスはデータファイルと一致します。マニフェストファイルがすでに存在する場合、ALLOWOVERWRITE 'true' を設定して上書きします。
PARALLELいいえパラレルエクスポートを制御します。デフォルト:ONON の場合、各計算ノードが個別の出力ファイルを書き込みます。出力ファイル数はご利用のインスタンスの計算ノード数と等しくなります。OFF または FALSE の場合、データはシリアルにエクスポートされ、合計サイズが 8 GB 以下であれば単一のファイルに保存されます。
option 'value'いいえkey value 形式の追加オプション。下記のオプション表をご参照ください。

オプション

オプションタイプ必須説明
ENDPOINTSTRINGはいOSS エンドポイント。リージョンごとのエンドポイントの一覧については、「リージョンとエンドポイント」をご参照ください。
FDWSTRINGはいoss_fdw 拡張の名前。UNLOAD 文のための一時的な OSS サーバーを作成するために必要です。
FORMATFILETYPEDELIMITERESCAPE、その他一時的な OSS 外部テーブルを作成するためのオプション。詳細については、「OSS 外部テーブルの概要」をご参照ください。

CSV へのエクスポート

  1. ソーステーブルを作成し、テストデータを挿入します。

    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;
  2. ソースデータを検証します。

    SELECT * FROM local_t LIMIT 5;

    期待される出力:

     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)
  3. ac を CSV 形式で OSS にエクスポートします。

    UNLOAD ('SELECT a, c FROM local_t')
    TO 'oss://adbpg-regress/local_t/'
    ACCESS_KEY_ID 'LTAI****************'
    SECRET_ACCESS_KEY 'TNPP*************************'
    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
  4. ファイルが OSS に書き込まれたことを確認します。

    ossutil --config hangzhou-zmf.config ls oss://adbpg-regress/local_t/

    期待される出力 (計算ノードごとに 1 ファイル):

    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
  5. CSV の内容を検査します。

    head -n 10 adbpgforeigntabletmp_20200907164801_1354519958_20200907164801_652261618_seg2_0.csv

    期待される出力:

    7,1225341d0d367a69b1b345536b21ef73
    19,424a7a5c36066842f4de8c8a8341fc89
    27,c214432e9928e4a6f7bef7bd815424c0
    29,ade5d636e2b5d2a606a02e79255da4bd
    37,85660e60ede47b68493f6295620db568

マニフェストファイルを使用したエクスポート

以下の 3 つの例はすべて、前のセクションで作成した同じソーステーブル (local_t) を使用します。

シナリオ 1:データファイルと並行してマニフェストファイルを生成する

UNLOAD ('SELECT * FROM local_t')
TO 'oss://adbpg-regress/local_t/'
ACCESS_KEY_ID 'LTAI****************'
SECRET_ACCESS_KEY 'TNPP*************************'
FORMAT AS CSV
MANIFEST
ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com'
FDW 'oss_fdw';

エクスポートされたファイルをリストします:

ossutil ls -s oss://adbpg-regress/local_t/

期待される出力 — 3 つのデータファイルと 1 つのマニフェストファイルが同じパスプレフィックスを共有します:

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

マニフェストの内容を表示します:

ossutil cat oss://adbpg-regress/local_t/_20210114100329_3e9b07726306d88b3193dc95c10a5c5c_manifest
{
  "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"}
  ]
}

シナリオ 2:マニフェストファイルを別のバケットに書き込む

ALLOWOVERWRITE 'true' は既存のマニフェストファイルのみを上書きします。データファイルは上書きされず、必要に応じて手動で削除する必要があります。
UNLOAD ('SELECT * FROM local_t')
TO 'oss://adbpg-regress/local_t/'
ACCESS_KEY_ID 'LTAI****************'
SECRET_ACCESS_KEY 'TNPP*************************'
FORMAT AS CSV
MANIFEST 'oss://adbpg-regress-2/unload_manifest/t_manifest'
ALLOWOVERWRITE 'true'
ENDPOINT 'oss-cn-hangzhou-internal.aliyuncs.com'
FDW 'oss_fdw';

データファイルが元のバケットにあり、マニフェストが別のバケットにあることを確認します:

# データファイル
ossutil ls -s oss://adbpg-regress/local_t/
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
# 別のバケットにあるマニフェストファイル
ossutil cat oss://adbpg-regress-2/unload_manifest/t_manifest
{
  "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"}
  ]
}

よくある質問

エクスポートによって複数の CSV ファイルが生成されたのはなぜですか?

UNLOAD はデフォルト (PARALLEL ON) で、計算ノードごとに 1 つの出力ファイルを書き込みます。ご利用のインスタンスに 4 つの計算ノードがある場合、4 つのファイルが生成されます。単一のファイルにエクスポートするには、PARALLEL OFF を設定しますが、これは合計データサイズが 8 GB 以下の場合に限ります。

次のステップ