分析が完了し、データセットを共有したり、結果をアーカイブしたり、下流のデータレイクにデータを供給する必要がある場合、AnalyticDB for MySQL Data Warehouse Edition (V3.0) から直接 Object Storage Service (OSS) へデータをエクスポートできます。このエクスポートでは、OSS 外部テーブルをターゲットとして使用し、標準の INSERT 文でデータを書き込みます。CSV 形式および Parquet 形式の両方がサポートされています。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
ご利用の AnalyticDB for MySQL クラスターと同じリージョンにある OSS バケット。設定手順は以下のとおりです:

OSS の有効化を行います。
バケット内にディレクトリを作成し、エクスポートしたデータを格納します(例:
adb_data/)。
アカウント、データベース、およびホワイトリストが設定済みの AnalyticDB for MySQL Data Warehouse Edition (V3.0) クラスター。詳細については、「クラスターの作成」をご参照ください。
クラスターがエラスティックモードで実行されている場合は、AnalyticDB for MySQL コンソールにログインし、クラスターの詳細ページに移動して、Elastic Network Interface (ENI) を ネットワーク情報 セクションで有効化します。

エクスポートの概要
エクスポートのワークフローは、以下の 3 つのステップで構成されます。
ターゲット OSS ディレクトリに対応する OSS 外部テーブルを作成します。
ソーステーブルから外部テーブルへデータを書き込むために、
INSERT文を実行します。
エクスポートが完了したら、OSS コンソールにログインしてターゲットディレクトリを確認するか、外部テーブルに対して SELECT クエリを実行して出力を検証してください。
非パーティション外部テーブルへのエクスポート
外部テーブルの作成
ターゲットデータベースに外部テーブルを作成するには、「非パーティションオブジェクト用の OSS 外部テーブルの作成」の手順に従ってください。
書き込み文の選択
外部テーブルの OSS パスに既存のオブジェクトが存在する場合の処理方法に応じて、書き込み文を選択してください。
| 文 | 動作 | 使用タイミング |
|---|---|---|
INSERT INTO ... SELECT | データを追加します。各実行で新しい OSS オブジェクトが生成され、既存のオブジェクトには影響しません。 | 増分エクスポート、または複数回の実行結果を累積する場合。 |
INSERT OVERWRITE ... SELECT | 外部テーブルの OSS パス内のすべての既存オブジェクトを削除した後、新しいデータを書き込みます。 | フルリフレッシュ、または前のエクスポートを完全に置き換える場合。 |
REPLACE SELECT FROM | INSERT INTO ... SELECT と同様の動作です。OSS 外部テーブルはプライマリキーをサポートしないため、重複排除は行われません。 | 既存データが変更されず、新規データが新しい OSS オブジェクトに保存される場合のデータ追加。 |
構文:
-- データの追加
INSERT INTO <external_table>
SELECT <columns> FROM <source_table>;
-- データの置き換え
INSERT OVERWRITE <external_table>
SELECT <columns> FROM <source_table>;例: — source_table(adb_demo データベース内)から、OSS 外部テーブル oss_table へデータをエクスポートします。
-- 追加
INSERT INTO oss_table
SELECT col1, col2, col3 FROM source_table;
-- 置き換え
INSERT OVERWRITE oss_table
SELECT col1, col2, col3 FROM source_table;SELECT リストには、すべての列を含める必要があります。列のサブセットを選択することはサポートされていません。
単一 OSS オブジェクトへのエクスポート(CSV のみ、バージョン 3.1.2 以降)
デフォルトでは、データは複数の OSS オブジェクトに書き込まれます。AnalyticDB for MySQL バージョン 3.1.2 以降では、output_filename ヒントを使用して、すべてのデータを指定された名前の単一 CSV オブジェクトにエクスポートできます。
/*+output_filename=<filename>*/INSERT [OVERWRITE] <external_table>
SELECT <columns> FROM <source_table>;例:
/*+output_filename=adb.txt*/INSERT OVERWRITE oss_table
SELECT * FROM source_table;OVERWRITE キーワードにより、同じ名前の既存オブジェクトが上書きされるかどうかが決定されます。ディレクトリ内の他のオブジェクトには影響しません。
単一オブジェクトエクスポートは、CSV 形式およびバージョン 3.1.2 以降のみで利用可能です。Parquet はサポートされていません。それより前のバージョンでは、システムは常に複数のオブジェクトを生成し、同時タスク実行数に基づいてその数を決定します。
パーティション外部テーブルへのエクスポート
パーティション外部テーブルは、階層的な OSS ディレクトリ構造に対応します。データが書き込まれる際、パーティションキーの値はディレクトリ名となり、エクスポートされた CSV または Parquet オブジェクト内には列として格納されません。
例: 2 つのパーティションキー(pcol1 および pcol2)と 3 つのデータ列を持つテーブルを adb_data/ へエクスポートします。pcol1=1 かつ pcol2=a の行は、以下に書き込まれます。
adb_data/pcol1=1/pcol2=a/CSV または Parquet オブジェクトには、3 つのデータ列の値のみが含まれます。パーティションキーの値(1 および a)は、ファイル内ではなくディレクトリパスに表示されます。
パーティション外部テーブルのデータは、単一 OSS オブジェクトへエクスポートできません。output_filename ヒントは、パーティションテーブルではサポートされていません。
外部テーブルの作成
「外部テーブルを使用して Data Warehouse エディションにデータをインポートする」の手順に従って、パーティション化された OSS 外部テーブルを作成します。
パーティション指定モードの選択
書き込み時にパーティション値についてどれだけ把握しているかに応じて、モードを選択してください。
| モード | 構文 | 動作 |
|---|---|---|
| 完全静的 | PARTITION(par1=val1, par2=val2, ...) | すべてのパーティション値が指定されます。対応するパーティションにデータが追加され、毎回新しいオブジェクトが生成されます。 |
| 静的・動的混合 | PARTITION(par1=val1, par2, ...) | 上位レベルのパーティション値が指定され、下位レベルの値はソースデータから導出されます。 |
| 完全動的 | PARTITION 句なし | すべてのパーティション値がソースデータから導出されます。 |
構文:
-- 完全静的パーティション
INSERT INTO <external_table> PARTITION(<par1>=<val1>, <par2>=<val2>, ...)
SELECT <columns> FROM <source_table>;
-- 静的・動的混合パーティション
INSERT INTO <external_table> PARTITION(<par1>=<val1>, <par2>, ...)
SELECT <columns>, <par2_column> FROM <source_table>;
-- 完全動的パーティション
INSERT INTO <external_table>
SELECT <columns>, <par1_column>, <par2_column> FROM <source_table>;例:
-- 完全静的パーティション
INSERT INTO oss_table_par PARTITION(par1=val1, par2=val2)
SELECT col1, col2, col3 FROM source_table;
-- 静的・動的混合パーティション
INSERT INTO oss_table_par PARTITION(par1=val1, par2)
SELECT col1, col2, col3, par2col FROM source_table;
-- 完全動的パーティション
INSERT INTO oss_table_par
SELECT col1, col2, col3, par1col, par2col FROM source_table;パーティション列以外のすべての列を SELECT リストに含める必要があります。列のサブセットを選択することはサポートされていません。
パーティションの上書き
INSERT OVERWRITE PARTITION SELECT は、INSERT INTO PARTITION SELECT と同様に動作しますが、新規データの書き込み前に、ターゲットパーティション内の既存オブジェクトが削除されます。新規データがないパーティションには影響しません。
INSERT OVERWRITE <external_table> PARTITION(<par1>=<val1>, <par2>=<val2>, ...) [IF NOT EXISTS]
SELECT <columns> FROM <source_table>;例:
INSERT OVERWRITE oss_table_par PARTITION(par1=val1, par2=val2) IF NOT EXISTS
SELECT col1, col2, col3 FROM source_table;パーティションへの追加
REPLACE INTO PARTITION SELECT FROM は、INSERT INTO PARTITION SELECT FROM と同一の動作です。パーティション外部テーブルはプライマリキーをサポートしないため、重複排除は行われません。
注意事項
出力に列名を含める
デフォルトでは、エクスポートされたオブジェクトにはヘッダ行が含まれません。列名を含めるには、文の先頭に以下のヒントを追加します。
/*+sql_output_oss_file_head_enable=true*/INSERT [OVERWRITE] <external_table>
SELECT <columns> FROM <source_table>;大規模なエクスポートを非同期で実行する
INSERT INTO および INSERT OVERWRITE SELECT は、デフォルトで同期的に実行されます。数百ギガバイト規模のエクスポートでは、ジョブが完了する前にクライアント接続がタイムアウトする可能性があります。これを回避するには、文の先頭に SUBMIT JOB を付与して、エクスポートを非同期で実行します。
SUBMIT JOB INSERT OVERWRITE <external_table> SELECT * FROM <source_table>;送信後にジョブのステータスを確認してください。詳細については、「インポートタスクの非同期送信」をご参照ください。
制限事項
CSV 形式および Parquet 形式のみがサポートされています。
すべての列を外部テーブルに書き込む必要があります。列のサブセットを選択することはサポートされていません。
行単位の挿入はサポートされていません。
INSERT INTO VALUESおよびREPLACE INTO VALUESは、外部テーブルではサポートされていません。単一オブジェクトエクスポート(
output_filenameヒントによる)は、CSV 形式のみで、バージョン 3.1.2 以降で利用可能です。パーティション外部テーブルでは、単一オブジェクトエクスポートはサポートされていません。