AnalyticDB for MySQL データウェアハウスエディション (V3.0) では、外部テーブルを用いて AnalyticDB for MySQL と外部ストレージシステム間でデータを移動します。本トピックでは、AnalyticDB for MySQL クラスターから Apsara File Storage for HDFS へ外部テーブルを用いてデータをエクスポートする方法について説明します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
V3.1.4.4 以降のマイナーバージョンで実行中の AnalyticDB for MySQL クラスター。
クラスターのマイナーバージョンを確認するには、「AnalyticDB for MySQL クラスターのバージョンを確認する方法」をご参照ください。マイナーバージョンをアップグレードするには、テクニカルサポートに連絡してください。
エクスポート先のデータを格納するフォルダを備えた Apsara File Storage for HDFS クラスター。本例では、
hdfs_output_test_csv_dataという名前のフォルダを使用します。INSERT OVERWRITEは、新規データの書き込み前に送信先フォルダ内の既存ファイルをすべて削除します。誤ったデータ損失を防ぐため、各エクスポートジョブごとに既存のフォルダを再利用せず、新しい送信先フォルダを作成してください。AnalyticDB for MySQL からのアクセスを許可するために、Apsara File Storage for HDFS クラスターで設定済みの以下のサービスアクセスポート。
ノード 目的 デフォルトポート 設定パラメーター 参考情報 NameNode ファイルシステムのメタデータの読み取りおよび書き込み 8020 fs.defaultFScore-default.xml DataNode データの読み取りおよび書き込み 50010 dfs.datanode.addresshdfs-default.xml エラスティックモードのクラスター: [クラスター情報] ページの [ネットワーク情報] で [ENI] が有効になっていること。

注意事項
CSV および Parquet 形式のファイルのみエクスポート可能です。ORC はサポートされていません。
外部テーブルでは、
INSERT INTO VALUESおよびREPLACE INTO VALUESはサポートされていません。INSERT INTO ... SELECTまたはREPLACE INTO ... SELECTをご使用ください。外部テーブルのすべての列をエクスポート対象に含める必要があります。一部の列のみをエクスポートすることはできません。
パーティション化された外部テーブルでは、個別のファイルをエクスポートすることはできません。データは常にパーティションディレクトリ全体に分散されます。
パーティション列の値は、エクスポートされたデータファイル内の列としてではなく、HDFS のディレクトリ名として保存されます。たとえば、パーティション列
p1=1およびp2=aを指定してadb_data/へエクスポートした場合、データはadb_data/p1=1/p2=a/に配置されます。エクスポートされた CSV または Parquet ファイルには、パーティション列以外の列のみが含まれます。
Apsara File Storage for HDFS へのデータエクスポート
ステップ 1:AnalyticDB for MySQL クラスターへの接続
クラスターに接続します。詳細については、「AnalyticDB for MySQL クラスターへの接続」をご参照ください。
ステップ 2:ソースデータベースおよびソーステーブルの作成
本例では、ソースとして adb_demo という名前のデータベースを使用します。
ソースデータベースを作成します。詳細については、「データベースの作成」をご参照ください。
adb_demo内に、adb_hdfs_import_sourceという名前のソーステーブルを作成します。CREATE TABLE IF NOT EXISTS adb_hdfs_import_source ( uid string, other string ) DISTRIBUTED BY HASH(uid);テストデータを挿入します。
INSERT INTO adb_hdfs_import_source VALUES ("1", "a"), ("2", "b"), ("3", "c");
ステップ 3:外部テーブルの作成
Apsara File Storage for HDFS の送信先フォルダに対応する外部テーブルを adb_demo 内に作成します。AnalyticDB for MySQL では、標準外部テーブルおよびパーティション化された外部テーブルの 2 種類の外部テーブルがサポートされています。
標準外部テーブル
標準外部テーブルでは、パーティションサブディレクトリを含まない単一のディレクトリにすべてのデータがエクスポートされます。以下の例では、CSV 形式および Parquet 形式の標準外部テーブルの作成方法を示します。
CSV 形式:
CREATE TABLE IF NOT EXISTS hdfs_import_external
(
uid string,
other string
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"parquet",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_output_test_csv_data"
}';Parquet 形式:
CREATE TABLE IF NOT EXISTS hdfs_import_external
(
uid string,
other string
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"parquet",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_output_test_csv_data"
}';パーティション化された外部テーブル
パーティション化された外部テーブルでは、パーティション列の値に基づいてエクスポートされたデータがパーティションサブディレクトリに整理されます。CREATE TABLE 文では、通常の列(uid、other など)およびパーティション列(p1、p2、p3 など)の両方を定義します。
CREATE TABLE IF NOT EXISTS hdfs_import_external_par
(
uid string,
other string,
p1 date,
p2 int,
p3 varchar
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"csv",
"delimiter":",",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_output_test_csv_data",
"partition_column":"p1, p2, p3"
}';構文の完全な仕様については、「外部テーブルを使用したデータウェアハウスエディションへのデータインポート」トピックの「Apsara File Storage for HDFS 外部テーブルの作成」および「パーティション化された Apsara File Storage for HDFS 外部テーブルの作成」をご参照ください。
ステップ 4:データのエクスポート
付録に記載されているエクスポート方法のいずれかを使用して、エクスポートジョブを実行します。
次のステップ
エクスポートが完了したら、以下のいずれかの方法でデータを検証してください。
Hadoop クライアントを使用して、
hdfs_output_test_csv_data送信先フォルダを閲覧します。外部テーブル経由で AnalyticDB for MySQL からエクスポートされたデータをクエリします。標準外部テーブルおよびパーティション化された外部テーブルの両方で、クエリ構文は同一です。
SELECT * FROM hdfs_import_external LIMIT 100;
付録 1:標準外部テーブルのエクスポート方法
標準外部テーブルでは、4 種類のエクスポート方法がサポートされています。すべての方法において、外部テーブルのすべての列を SELECT 文に含める必要があります。
| 方法 | 文 | 動作 |
|---|---|---|
| 追加 | INSERT INTO | 送信先ディレクトリに新しいファイルを追加します。既存のファイルは上書きされません。 |
| 追加(同等) | REPLACE INTO | 外部テーブルでは INSERT INTO と同一の動作です。外部テーブルにはプライマリキーがないため、重複排除は行われません。 |
| 上書き | INSERT OVERWRITE | 送信先ディレクトリ内のすべての既存ファイルを削除し、その後に新規データを書き込みます。慎重にご使用ください。 |
| 非同期上書き | SUBMIT JOB INSERT OVERWRITE | 上書きと同じ動作ですが、非同期で実行されます。ステータス追跡用のジョブ ID が返されます。 |
INSERT INTO
実行ごとに、既存のファイルを削除せずに HDFS の送信先ディレクトリに新しいファイルが追加されます。
構文:
INSERT INTO <target_table>
SELECT <col_name> FROM <source_table>;例:
INSERT INTO hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;col1, col2, col3 は、外部テーブルのすべての列を表します。REPLACE INTO
HDFS 外部テーブルでは、INSERT INTO と同等です。外部テーブルにはプライマリキーがないため、REPLACE INTO は行の置換ではなく、送信先ディレクトリへの新しいファイルの追加を行います。
構文:
REPLACE INTO <target_table>
SELECT <col_name> FROM <source_table>;例:
REPLACE INTO hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;INSERT OVERWRITE
新規データの書き込み前に、送信先ディレクトリ内のすべてのファイルを削除します。
この操作は元に戻すことができません。外部テーブルのパス内にある既存のすべてのファイルは、永久に削除されます。
構文:
INSERT OVERWRITE <target_table>
SELECT <col_name> FROM <source_table>;例:
INSERT OVERWRITE hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;SUBMIT JOB INSERT OVERWRITE(非同期)
上書きエクスポートを非同期で実行し、直ちにジョブ ID を返します。セッションをブロックする可能性のある大規模なエクスポートにこの方法をご使用ください。
構文:
SUBMIT JOB INSERT OVERWRITE <target_table>
SELECT <col_name> FROM <source_table>;例:
SUBMIT JOB INSERT OVERWRITE hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;返されるジョブ ID は、非同期タスクを識別します。
+---------------------------------------+
| job_id |
+---------------------------------------+
| 2020112122202917203100908203303****** |
+---------------------------------------+タスクのステータスを確認するには、「インポートタスクを非同期で送信する」をご参照ください。
付録 2:パーティション化された外部テーブルのエクスポート方法
パーティション化された外部テーブルを使用する場合、パーティション列の値を指定するために文に PARTITION 句を含める必要があります。パーティション値は、完全静的、静的・動的混合、または完全動的ないずれかになります。
すべての方法において、外部テーブルのパーティション列以外のすべての列を SELECT 文に含める必要があります。
| 方法 | 文 | 動作 |
|---|---|---|
| 追加 | INSERT INTO PARTITION | 一致するパーティションディレクトリに新しいファイルを追加します。既存のファイルは上書きされません。 |
| 追加(同等) | REPLACE INTO PARTITION | 外部テーブルでは INSERT INTO PARTITION と同一の動作です。 |
| 上書き | INSERT OVERWRITE PARTITION | 指定されたパーティションディレクトリ内の既存データのみを上書きします。影響を受けないパーティションは変更されません。 |
| 非同期上書き | SUBMIT JOB INSERT OVERWRITE | 上書きと同じ動作ですが、非同期で実行されます。 |
INSERT INTO PARTITION
実行ごとに、一致するパーティションディレクトリに新しいファイルが追加されます。
完全静的パーティション — すべてのパーティション値が明示的に指定されます。
INSERT INTO <target_table> PARTITION(par1=val1, par2=val2, ...)
SELECT <col_name> FROM <source_table>;例:
INSERT INTO hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test')
SELECT col1, col2, col3 FROM adb_hdfs_import_source;静的・動的混合パーティション — 一部のパーティション値は静的であり、他の値はクエリ結果から導出されます。
PARTITION 句では、静的パーティション列を動的パーティション列よりも前に指定する必要があります。INSERT INTO <target_table> PARTITION(par1=val1, par2, ...)
SELECT <col_name> FROM <source_table>;例:
INSERT INTO hdfs_import_external_par PARTITION(p1='2021-05-27', p2, p3)
SELECT col1, col2, col3 FROM adb_hdfs_import_source;完全動的パーティション — パーティション値はクエリ結果から導出され、PARTITION 句は不要です。
INSERT INTO <target_table>
SELECT <col_name> FROM <source_table>;例:
INSERT INTO hdfs_import_external_par
SELECT col1, col2, col3 FROM adb_hdfs_import_source;REPLACE INTO PARTITION
HDFS 外部テーブルでは、INSERT INTO PARTITION と同等です。外部テーブルにはプライマリキーがないため、REPLACE INTO PARTITION は行の置換ではなく、新しいファイルの追加を行います。
完全静的パーティション:
REPLACE INTO <target_table> PARTITION(par1=val1, par2=val2, ...)
SELECT <col_name> FROM <source_table>;例:
REPLACE INTO hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test')
SELECT col1, col2, col3 FROM adb_hdfs_import_source;静的・動的混合パーティション:
PARTITION 句では、静的パーティション列を動的パーティション列よりも前に指定する必要があります。REPLACE INTO <target_table> PARTITION(par1=val1, par2, ...)
SELECT <col_name> FROM <source_table>;例:
REPLACE INTO hdfs_import_external_par PARTITION(p1='2021-05-06', p2, p3)
SELECT col1, col2, col3 FROM adb_hdfs_import_source;完全動的パーティション:
REPLACE INTO <target_table>
SELECT <col_name> FROM <source_table>;例:
REPLACE INTO hdfs_import_external_par
SELECT col1, col2, col3 FROM adb_hdfs_import_source;INSERT OVERWRITE PARTITION
指定されたパーティションディレクトリ内の既存データを上書きします。文でカバーされないパーティションは影響を受けません。オプションの IF NOT EXISTS 句を使用すると、既にデータが存在するパーティションへの書き込みをスキップできます。
この操作は元に戻すことができません。対象となるパーティション内の既存データは、永久に削除されます。
構文:
INSERT OVERWRITE <target_table> PARTITION(par1=val1, par2=val2, ...) [IF NOT EXISTS]
SELECT <col_name> FROM <source_table>;例:
INSERT OVERWRITE hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test') IF NOT EXISTS
SELECT col1, col2, col3 FROM adb_hdfs_import_source;IF NOT EXISTS により、既にデータが存在するパーティションへの書き込みが防止され、その既存コンテンツは保持されます。SUBMIT JOB INSERT OVERWRITE(非同期)
パーティション上書きエクスポートを非同期で実行し、直ちにジョブ ID を返します。
構文:
SUBMIT JOB INSERT OVERWRITE <target_table>
SELECT <col_name> FROM <source_table>;例:
SUBMIT JOB INSERT OVERWRITE hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test') IF NOT EXISTS
SELECT col1, col2, col3 FROM adb_hdfs_import_source;返されるジョブ ID は、非同期タスクを識別します。
+---------------------------------------+
| job_id |
+---------------------------------------+
| 2020112122202917203100908203303****** |
+---------------------------------------+タスクのステータスを確認するには、「インポートタスクを非同期で送信する」をご参照ください。