AnalyticDB for MySQL の外部テーブルは、ご利用の Hadoop 分散ファイルシステム (HDFS) とのブリッジとして機能します。HDFS ファイルに対応する外部テーブルを作成し、INSERT SELECT 文を実行してデータを AnalyticDB for MySQL のネイティブテーブルにロードします。
前提条件
作業を開始する前に、以下の内容を確認してください。
クラスター要件:
お客様の AnalyticDB for MySQL クラスターは、カーネルバージョン 3.1.4 以降を実行しています。バージョンの確認および更新を行うには、AnalyticDB for MySQL コンソール にログインし、[設定情報] セクションに移動します。[クラスター情報] ページの。手順については、「クラスターのマイナーバージョンを更新する」をご参照ください。
ご利用のクラスターは、エラスティックモードで実行されているデータウェアハウスエディションである必要があります。ENI アクセスにはエラスティックモードが必要です。
HDFS 要件:
ご利用の HDFS データファイルは、CSV、Parquet、または ORC 形式である必要があります。
ご利用の HDFS クラスターが実行中であり、インポート対象のデータが HDFS ディレクトリ内に存在している必要があります。本トピックでは、例として
hdfs_import_test_data.csvを使用します。AnalyticDB for MySQL からのアクセスのために、HDFS クラスターで以下のサービスポートが開放されている必要があります。
NameNode:ファイルシステムのメタデータを管理します。デフォルトポート:8020。設定は
fs.defaultFSを通じて行います。「core-default.xml」をご参照ください。DataNode:データの読み取りおよび書き込みを処理します。デフォルトポート:50010。設定は
dfs.datanode.addressを通じて行います。「hdfs-default.xml」をご参照ください。
ネットワーク構成:
データをインポートする前に、ご利用のクラスターで ENI アクセスを有効化してください。
AnalyticDB for MySQL コンソール にログインします。
クラスター情報 ページで、ネットワーク情報 セクションに移動します。
Elastic Network Interface (ENI) スイッチをオンにします。
ENI の有効化または無効化により、約 2 分間データベース接続が中断されます。この間、読み取りおよび書き込み操作は利用できません。変更はメンテナンスウィンドウ中に計画してください。
HDFS データのインポート
ステップ 1:ターゲットデータベースの作成
CREATE DATABASE IF NOT EXISTS adb_demo;ステップ 2:HDFS 外部テーブルの作成
adb_demo データベース内で、ご利用の HDFS データに対応する外部テーブルを作成します。ご利用のファイル形式に一致するタブを選択してください。
CSV:
CREATE TABLE IF NOT EXISTS hdfs_import_test_external_table
(
uid string,
other string
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"csv",
"delimiter":",",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_import_test_csv_data/hdfs_import_test_data.csv"
}';Parquet:
CREATE TABLE IF NOT EXISTS hdfs_import_test_external_table
(
uid string,
other string
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"parquet",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_import_test_parquet_data/"
}';ORC: Parquet と同じ構文を使用しますが、"format":"orc" に設定します。
TABLE_PROPERTIES で使用可能なすべてのパラメーターについては、「外部テーブルのパラメーター」をご参照ください。
ステップ 3:送信先テーブルの作成
インポートされたデータを格納するための AnalyticDB for MySQL のネイティブテーブルを作成します。
標準テーブル:
CREATE TABLE IF NOT EXISTS adb_hdfs_import_test
(
uid string,
other string
)
DISTRIBUTED BY HASH(uid);パーティションテーブル — データ列とパーティションキー列の両方を含める必要があります。パーティションキー列は列リストの末尾に記述してください。
CREATE TABLE IF NOT EXISTS adb_hdfs_import_parquet_partition
(
uid string,
other string,
p1 date,
p2 int,
p3 varchar
)
DISTRIBUTED BY HASH(uid);ステップ 4:データのインポート
以下のいずれかの方法を選択してください。標準テーブルとパーティションテーブルのどちらでも構文は同じです。
| 方法 | コマンド | 使用タイミング |
|---|---|---|
| INSERT OVERWRITE(推奨) | INSERT OVERWRITE <dest_table> SELECT * FROM <external_table> | 大規模なデータセット。高スループットでのバッチインポートをサポートします。インポートが成功した場合のみデータが表示され、失敗時はロールバックされます。 |
| INSERT INTO | INSERT INTO <dest_table> SELECT * FROM <external_table> | 小規模なデータセット。挿入された行はすぐにクエリで利用可能になります。 |
| 非同期タスク | SUBMIT JOB INSERT OVERWRITE <dest_table> SELECT * FROM <external_table> | 長時間実行されるインポート。すぐに job_id が返されるため、進行状況をモニターできます。 |
例 — INSERT OVERWRITE:
INSERT OVERWRITE adb_hdfs_import_test
SELECT * FROM hdfs_import_test_external_table;例 — 非同期タスク:
SUBMIT JOB INSERT OVERWRITE adb_hdfs_import_test
SELECT * FROM hdfs_import_test_external_table;コマンドは job_id を返します。
+---------------------------------------+
| job_id |
+---------------------------------------+
| 2020112122202917203100908203303****** |
+---------------------------------------+job_id を使用してインポートのステータスを確認します。詳細については、「インポートタスクを非同期で送信する」をご参照ください。
インポート結果の確認
インポート完了後、adb_demo に対して以下のクエリを実行し、データが正しくロードされたことを確認します。
SELECT * FROM adb_hdfs_import_test LIMIT 100;パーティション化された HDFS 外部テーブルの作成
HDFS データが階層的なディレクトリ構造で整理されている場合は、パーティション化された外部テーブルを使用します。HDFS は Parquet、CSV、および ORC 形式のパーティション化されたデータをサポートしています。パーティションは次のようなディレクトリ階層を形成します。
parquet_partition_classic/
├── p1=2020-01-01
│ ├── p2=4
│ │ ├── p3=SHANGHAI
│ │ │ ├── 000000_0
│ │ │ └── 000000_1
│ │ └── p3=SHENZHEN
│ │ └── 000000_0
│ └── p2=6
│ └── p3=SHENZHEN
│ └── 000000_0
├── p1=2020-01-02
│ └── p2=8
│ ├── p3=SHANGHAI
│ │ └── 000000_0
│ └── p3=SHENZHEN
│ └── 000000_0
└── p1=2020-01-03
└── p2=6
├── p2=HANGZHOU
└── p3=SHENZHEN
└── 000000_0次の文は、このパーティション化された Parquet データセット用の外部テーブルを作成します。
CREATE TABLE IF NOT EXISTS hdfs_parquet_partition_table
(
uid varchar,
other varchar,
p1 date,
p2 int,
p3 varchar
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"hdfs_url":"hdfs://172.17.***.**:9000/adb/parquet_partition_classic/",
"format":"parquet",
"partition_column":"p1, p2, p3"
}';CSV または ORC データを使用する場合は、"format" を "csv" または "orc" に変更します。format を省略した場合、デフォルトで CSV が使用されます。
パーティション化された外部テーブルのルール:
partition_columnプロパティには、ディレクトリ階層に現れる順序でパーティションキー列を列挙します。順序は正確に一致させる必要があります。CREATE TABLE文でパーティションキー列を定義し、すべてのデータ列の後に列リストの末尾に配置します。パーティションキー列は、以下のデータ型をサポートします:
BOOLEAN、TINYINT、SMALLINT、INT、INTEGER、BIGINT、FLOAT、DOUBLE、DECIMAL、VARCHAR、STRING、DATE、およびTIMESTAMP。パーティションキー列はクエリ内で通常の列と同様に動作し、SELECT やフィルターに使用できます。
その他の
TABLE_PROPERTIESパラメーターについては、「CSV パラメーター表」または「Parquet/ORC パラメーター表」をご参照ください。
外部テーブルのパラメーター
CSV パラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
ENGINE='HDFS' | はい | ストレージエンジンを HDFS に設定します。 |
TABLE_PROPERTIES | はい | HDFS 接続およびフォーマット設定を含む JSON オブジェクトです。 |
format | いいえ | ファイル形式。csv に設定します。省略した場合、デフォルトで CSV が使用されます。 |
delimiter | いいえ | 列のデリミタ文字。デフォルト:,。 |
hdfs_url | はい | HDFS ファイルまたはディレクトリへの絶対パス。hdfs:// で始まる必要があります。例:hdfs://172.17.*.*:9000/adb/data/file.csv |
partition_column | いいえ | パーティションキー列のカンマ区切りリスト。パーティション化されたデータには必須です。 |
compress_type | いいえ | 圧縮形式。CSV は Gzip のみをサポートします。 |
skip_header_line_count | いいえ | スキップするヘッダー行数。列ヘッダー行をスキップするには 1 に設定します。デフォルト:0。 |
hdfs_ha_host_port | いいえ | 高可用性 (HA) クラスター向けの NameNode IP アドレスおよびポート。形式:ip1:port1,ip2:port2。例:192.168.xx.xx:8020,192.168.xx.xx:8021 |
Parquet および ORC パラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
ENGINE='HDFS' | はい | ストレージエンジンを HDFS に設定します。 |
TABLE_PROPERTIES | はい | HDFS 接続およびフォーマット設定を含む JSON オブジェクトです。 |
format | はい | ファイル形式。parquet または orc に設定します。 |
hdfs_url | はい | HDFS ファイルまたはディレクトリへの絶対パス。hdfs:// で始まる必要があります。 |
partition_column | いいえ | パーティションキー列のカンマ区切りリスト。パーティション化されたデータには必須です。 |
hdfs_ha_host_port | いいえ | HA クラスター向けの NameNode IP アドレスおよびポート。形式:ip1:port1,ip2:port2。 |
Parquet および ORC ファイルの列マッピングルール:
CREATE TABLE文の列名は、ファイル内の列名と一致する必要があります(大文字・小文字は区別されません)。また、列の順序も一致させる必要があります。ファイル内の列の一部のみを含めることができます。除外された列はインポートされません。
CREATE TABLE文でファイルに存在しない列を参照した場合、その列に対するクエリは NULL を返します。
制限事項
CSV 外部テーブルは Gzip 圧縮のみをサポートします。
Parquet 外部テーブルは
STRUCT型の列を使用できません。ORC 外部テーブルは
LIST、STRUCT、またはUNION型を使用できません。MAP型はテーブル作成時に使用できますが、クエリはできません。
データ型のマッピング
Parquet から AnalyticDB for MySQL
| Parquet の基本型 | Parquet の論理型 | AnalyticDB for MySQL のデータ型 |
|---|---|---|
| BOOLEAN | 該当なし | BOOLEAN |
| INT32 | INT_8 | TINYINT |
| INT32 | INT_16 | SMALLINT |
| INT32 | 該当なし | INT または INTEGER |
| INT64 | 該当なし | BIGINT |
| FLOAT | 該当なし | FLOAT |
| DOUBLE | 該当なし | DOUBLE |
| FIXED_LEN_BYTE_ARRAY、BINARY、INT64、または INT32 | DECIMAL | DECIMAL |
| BINARY | UTF-8 | VARCHAR、STRING、または JSON(Parquet オブジェクトに JSON 型の列が含まれている場合に利用可能) |
| INT32 | DATE | DATE |
| INT64 | TIMESTAMP_MILLIS | TIMESTAMP または DATETIME |
| INT96 | 該当なし | TIMESTAMP または DATETIME |
ORC から AnalyticDB for MySQL
| ORC のデータ型 | AnalyticDB for MySQL のデータ型 |
|---|---|
| BOOLEAN | BOOLEAN |
| BYTE | TINYINT |
| SHORT | SMALLINT |
| INT | INT または INTEGER |
| LONG | BIGINT |
| DECIMAL | DECIMAL |
| FLOAT | FLOAT |
| DOUBLE | DOUBLE |
| BINARY、STRING、または VARCHAR | VARCHAR、STRING、または JSON(ORC オブジェクトに JSON 型の列が含まれている場合に利用可能) |
| TIMESTAMP | TIMESTAMP または DATETIME |
| DATE | DATE |
次のステップ
インポートタスクを非同期で送信する —
job_idを使用して長時間実行されるインポートをモニターしますクラスターのマイナーバージョンを更新する — クラスターをサポートされているカーネルバージョンに保つ