このトピックでは、外部テーブルとINSERT INTOステートメントを使用して、AnalyticDB for MySQL data Warehouse Edition (V3.0) からObject Storage Service (OSS) にデータをエクスポートする方法について説明します。 AnalyticDB for MySQLからOSSにエクスポートできるのは、CSVファイルとParquetファイルのみです。
前提条件
次の操作を実行してAnalyticDB for MySQLデータを保存することにより、OSSにディレクトリが作成されます。
OSS を有効化します。
説明関連するOSSバケットがAnalyticDB for MySQL Data Warehouse Edition (V3.0) クラスターと同じリージョンにあることを確認します。
OSSコンソールでバケットを作成します。 詳細については、「バケットの作成」をご参照ください。
バケットにディレクトリを作成します。 詳細については、「ディレクトリの作成」をご参照ください。
たとえば、OSSに
adb_data/
という名前のディレクトリを作成して、AnalyticDB For MySQL data Warehouse Edition (V3.0) からエクスポートされたデータを保存できます。
AnalyticDB for MySQL Data Warehouse Edition (V3.0) クラスター、アカウント、およびデータベースが作成されます。 ホワイトリストが設定されています。 詳細については、「クラスターの作成」をご参照ください。
AnalyticDB for MySQL Data Warehouse Edition (V3.0) クラスターがエラスティックモードの場合、AnalyticDB for MySQLコンソールにログインしてクラスター情報を表示し、[ネットワーク情報] セクションでelastic Network Interface (ENI) をオンにする必要があります。
手順
この例では、データはAnalyticDB for MySQL data Warehouse Edition (V3.0) クラスターのadb_demo
データベースのsource_table
テーブルからOSSのadb_Data
ディレクトリにエクスポートされます。
AnalyticDB for MySQLクラスターとデータベースに接続します。 詳細については、「AnalyticDB For MySQLクラスターへの接続」をご参照ください。
adb_demo
データベースに外部テーブルを作成します。 詳細については、「外部テーブルを使用してdata Warehouse Editionにデータをインポートする」トピックの「パーティション分割されていないオブジェクトのOSS外部テーブルの作成」をご参照ください。外部テーブルの型に基づいてデータを書き込むために実行できるSelect文をし、手順2で作成した外部テーブルにソースデータを書き込みます。 さまざまな種類の外部テーブルでサポートされている構文の詳細については、このトピックの「パーティション分割されていない外部テーブルへのデータの書き込みに使用される構文」および「パーティション分割された外部テーブルへのデータの書き込みに使用される構文」をご参照ください。
手順3の書き込みタスクが完了したら、OSSコンソールにログインし、OSSのディレクトリにエクスポートされたデータを表示します。 または、AnalyticDB for MySQLクラスターに接続して、外部テーブルにエクスポートされたデータを照会します。
パーティション分割されていない外部テーブルにデータを書き込むために使用される構文
INSERT INTO
またはINSERT OVERWRITE SELECT
を実行してデータをインポートすると、このステートメントはデフォルトで同期的に実行されます。 数百ギガバイトのデータがインポートされると、クライアントとAnalyticDB for MySQLサーバー間の接続が閉じられ、データインポートタスクが失敗する可能性があります。 この場合、INSERT OVERWRITE SELECT
ステートメントを非同期に実行して、ステートメントの先頭にSUBMIT JOB
を追加してデータをインポートすることを推奨します。 例: SUBMIT JOB INSERT OVERWRITE adb_table SELECT * FROM oss_table;
非同期タスクの送信方法の詳細については、「インポートジョブの非同期送信」をご参照ください。
デフォルトでは、OSSにインポートされたオブジェクトには列名は含まれません。 これらのオブジェクトに列名を付ける場合は、データインポートステートメントの先頭に次のヒントを追加します。/* + sql_output_oss_file_head_enable=true */
INSERT SELECT FROM
機能: データが別のテーブルに格納されている場合は、
INSERT SELECT FROM
ステートメントを実行して、データを外部テーブルにコピーできます。 ソーステーブルから外部テーブルにデータを書き込み、そのデータをOSSにエクスポートできます。 データが書き込まれるたびに、新しいOSSオブジェクトが生成されます。重要エクスポートする列はすべて外部テーブルに書き込む必要があります。 書き込む特定の列を指定することはできません。
構文:
INSERT INTO table_name SELECT select_statement FROM from_statement;
例:
source_tableからcol1、col2、col3を選択します。
INSERT OVERWRITE SELECT
機能:
INSERT OVERWRITE SELECT
ステートメントを実行して、データをテーブルにバッチ挿入できます。 データがすでに外部テーブルに存在する場合、新しいOSSオブジェクトが生成される前に、元の外部テーブルパス内のすべてのオブジェクトが削除されます。重要エクスポートする列はすべて外部テーブルに書き込む必要があります。 書き込む特定の列を指定することはできません。
構文:
INSERT OVERWRITE table_name select_statement;
例:
INSERT OVERWRITE oss_table SELECT col1, col2, col3 FROM source_table;
REPLACE SELECT FROM
機能: OSS外部テーブルはプライマリキーをサポートしていません。
REPLACE SELECT FROM
ステートメントの書き込みパフォーマンスは、INSERT SELECT FROM
ステートメントの書き込みパフォーマンスと一致しています。 データは別のテーブルに追加されます。 データが宛先テーブルにすでに存在する場合、既存のデータは変更されず、新しいデータは新しいOSSオブジェクトに保存されます。
CSV形式のデータを単一のOSSオブジェクトにエクスポートします (Parquet形式はサポートされていません)
機能: ヒントを使用して単一のOSSオブジェクトを指定し、このオブジェクトにデータをエクスポートできます。 overwriteキーワードを含めると、外部テーブルのTABLE_PROPERTIESパラメーターに定義されているディレクトリ内の同名のオブジェクトが上書きされます。 ディレクトリ内の他のオブジェクトは影響を受けません。
重要エクスポートする列はすべて外部テーブルに書き込む必要があります。 書き込む特定の列を指定することはできません。
バージョンの説明:
AnalyticDB for MySQL 3.1.2より前のバージョンは、この機能をサポートしていません。 オブジェクト名はシステムによって自動的に生成され、複数のオブジェクトがエクスポートされます。 システムは、並行タスクの実行速度に基づいてオブジェクトの数を動的に決定します。
AnalyticDB for MySQLバージョン3.1.2以降では、ヒントを使用して、AnalyticDB for MySQL外部テーブルからCSV形式で単一のOSSオブジェクトにデータをエクスポートできます。 オブジェクトの名前を指定できます。 外部テーブルのデータがヒントなしでエクスポートされる場合、3.1.2より前のバージョンのAnalyticDB for MySQLのように複数のオブジェクトがエクスポートされます。
構文:
/* + output_filename=adb.txt */INSERT [上書き] table_name SELECT select_statement FROM from_statement;
例:
/* + output_filename=adb.txt */INSERT [上書き] oss_table SELECT * FROM source_table;
パーティション分割された外部テーブルにデータを書き込むために使用される構文
INSERT INTO
またはINSERT OVERWRITE SELECT
を実行してデータをインポートすると、このステートメントはデフォルトで同期的に実行されます。 数百ギガバイトのデータがインポートされると、クライアントとAnalyticDB for MySQLサーバー間の接続が閉じられ、データインポートタスクが失敗する可能性があります。 この場合、INSERT OVERWRITE SELECT
ステートメントを非同期に実行して、ステートメントの先頭にSUBMIT JOB
を追加してデータをインポートすることを推奨します。 例: SUBMIT JOB INSERT OVERWRITE adb_table SELECT * FROM oss_table;
非同期タスクの送信方法の詳細については、「インポートジョブの非同期送信」をご参照ください。
デフォルトでは、OSSにインポートされたオブジェクトには列名は含まれません。 これらのオブジェクトに列名を付ける場合は、データインポートステートメントの先頭に次のヒントを追加します。/* + sql_output_oss_file_head_enable=true */
パーティションテーブルからオブジェクトにデータを書き込む場合、オブジェクトにはパーティションキー列のデータは含まれません。 パーティションキー列のデータがOSSディレクトリに表示されます。
パーティション化された外部テーブルのデータを単一のOSSオブジェクトにエクスポートすることはできません。
たとえば、パーティションテーブルには2つのパーティションキー列と3つの共通列が定義されています。 ハッシュパーティションのパーティションキー列の名前はpcol1で、値は1です。 リストパーティションのパーティションキー列はpcol2という名前で、値はaです。 パーティションテーブルのデータは、OSSのadb_data/ パスにエクスポートされます。 pcol1が1に設定され、pcol2がaに設定されているパーティションからデータを書き込む場合、オブジェクトの相対パスはadb_data/pcol1=1/pcol2=a/ です。 CSVまたはParquetオブジェクトには、pcol1およびpcol2列の値は含まれません。 3つの共通列の値のみが含まれる。
から選択してください
機能: INSERT INTO PARTITION SELECT FROM
文を実行して、パーティション分割された外部テーブルにデータをバッチ挿入できます。 データを書き込むときは、すべてのパーティション列とその値をpartitionフィールドで指定できます。 高レベルのパーティションのパーティション値のみを指定することもできます。 低レベルのパーティションのパーティション値は、動的に生成される。 または、PARTITIONフィールドを指定しない場合もあります。 この場合、すべてのレベルのパーティション値が動的に生成されます。
新しいデータが対応するパーティションに追加されます。 データが書き込まれるたびに、新しいOSSオブジェクトが生成されます。
エクスポートする列はすべて外部テーブルに書き込む必要があります。 書き込む特定の列を指定することはできません。
完全に静的なパーティション
構文:
INSERT INTO table_name PARTITION(par1=val1,par2=val2,...)
select_statement;
例:
INSERT INTO oss_table_par PARTITION(par1=val1、par2=val2)
col1、col2、col3 FROM source_tableを選択します。
静的動的パーティション
構文:
INSERT INTO table_name PARTITION(par1=val1,par2,...)
select_statement;
例:
INSERT INTO oss_table_par PARTITION(par1=val1,par2)
SELECT col1, col2, col3, par2col FROM source_table;
完全に動的なパーティション
構文:
INSERT INTO table_name
select_statement;
例:
INSERT INTO oss_table_par
SELECT col1, col2, col3, par1col, par2col FROM source_table;
上書きパーティションの選択を挿入
機能: INSERT OVERWRITE PARTITION SELECTステートメントは、INSERT INTO PARTITION SELECT
ステートメントと同じ方法で使用されます。 ただし、INSERT OVERWRITE PARTITION SELECTステートメントを実行すると、必要なパーティション内の既存のオブジェクトが消去されます。 新しいデータが書き込まれていないパーティション内のオブジェクトはクリアされません。
構文:
INSERT OVERWRITE table_name PARTITION(par1=val1、par2=val2、...)[存在しない場合]
select_statement;
例:
INSERT OVERWRITE oss_table_par PARTITION(par1=val1,par2=val2) 存在しない場合
SELECT col1, col2, col3 FROM source_table;
から選択してください
機能: 外部テーブルはプライマリキーをサポートしていません。 REPLACE INTO PARTITION SELECT FROM
ステートメントの書き込みパフォーマンスは、INSERT INTO PARTITION SELECT FROM
ステートメントの書き込みパフォーマンスと一致しています。
サポートされていないステートメント
AnalyticDB for MySQLでは、行ごとに外部テーブルにデータを挿入することはできません。 INSERT INTO VALUES
とREPLACE INTO VALUES
はサポートされていません。