AnalyticDB for MySQL は、外部テーブルを使用したデータのインポートとエクスポートをサポートしています。 このトピックでは、外部テーブルを使用して Hadoop 分散ファイルシステム (HDFS) からデータをクエリし、そのデータを AnalyticDB for MySQL にインポートする方法について説明します。
前提条件
お使いの AnalyticDB for MySQL クラスターは、カーネルバージョン 3.1.4 以降を実行している必要があります。
説明AnalyticDB for MySQL クラスターの マイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。
HDFS データファイルは、CSV、Parquet、または ORC 形式である必要があります。
HDFS クラスターが作成され、インポートするデータが HDFS フォルダーに準備されていること。 このトピックでは、
hdfs_import_test_data.csvフォルダーを例として使用します。次のサービスアクセスポートが、AnalyticDB for MySQL クラスター用に HDFS クラスターで設定されていること:
namenode: ファイルシステムメタデータの読み書きを行います。 ポート番号はfs.defaultFSパラメーターで設定できます。 デフォルトのポートは 8020 です。設定の詳細については、「core-default.xml」をご参照ください。
datanode: データの読み書きを行います。 ポート番号はdfs.datanode.addressパラメーターで設定できます。 デフォルトのポートは 50010 です。設定の詳細については、「hdfs-default.xml」をご参照ください。
AnalyticDB for MySQL Data Warehouse Edition (弾性モード) は、Elastic Network Interface (ENI) アクセスをサポートしています。
重要AnalyticDB for MySQL コンソールにログインします。 [クラスター情報] ページで、[ネットワーク情報] セクションで、Elastic Network Interface (ENI) スイッチをオンにします。
ENI ネットワークを有効または無効にすると、データベース接続が約 2 分間中断されます。 この間、読み取りおよび書き込み操作は利用できません。 ENI ネットワークを有効または無効にする前に、影響を評価してください。
手順
ターゲットデータベースを作成します。 この例では、AnalyticDB for MySQL クラスターのターゲットデータベースの名前は
adb_demoです。CREATE DATABASE IF NOT EXISTS adb_demo;adb_demoターゲットデータベースで、CREATE TABLE文を使用して、CSV、Parquet、または ORC 形式の外部テーブルを作成します。ターゲットテーブルを作成します。
次のいずれかの文を使用して、
adb_demoターゲットデータベースにターゲットテーブルを作成し、HDFS からインポートされたデータを格納します。標準の外部テーブル用のターゲットテーブルを作成します。 この例では、ターゲットテーブルの名前は
adb_hdfs_import_testです。 構文は次のとおりです。CREATE TABLE IF NOT EXISTS adb_hdfs_import_test ( uid string, other string ) DISTRIBUTED BY HASH(uid);パーティション化された外部テーブルのターゲットテーブルを作成する場合、
uidやotherなどの標準列と、p1、p2、p3などのパーティションキー列の両方を定義する必要があります。 この例では、ターゲットテーブルの名前はadb_hdfs_import_parquet_partitionです。 構文は次のとおりです。CREATE TABLE IF NOT EXISTS adb_hdfs_import_parquet_partition ( uid string, other string, p1 date, p2 int, p3 varchar ) DISTRIBUTED BY HASH(uid);
HDFS からターゲットの AnalyticDB for MySQL クラスターにデータをインポートします。
必要に応じてデータをインポートする方法を選択します。 パーティションテーブルにデータをインポートする構文は、標準テーブルの場合と同じです。 次の例では、標準テーブルを使用します。
方法 1 (推奨):
INSERT OVERWRITEを使用してデータをインポートします。 この方法はバッチインポートをサポートし、高いパフォーマンスを提供します。 データはインポートが成功した後に表示されます。 インポートが失敗した場合、データはロールバックされます。 次のコードは例です。INSERT OVERWRITE adb_hdfs_import_test SELECT * FROM hdfs_import_test_external_table;方法 2:
INSERT INTOを使用してデータをインポートします。 挿入されたデータはリアルタイムクエリで利用できます。 この方法は、少量のデータに使用します。 次のコードは例です。INSERT INTO adb_hdfs_import_test SELECT * FROM hdfs_import_test_external_table;方法 3: 非同期タスクを実行してデータをインポートします。 次のコードは例です。
SUBMIT JOB INSERT OVERWRITE adb_hdfs_import_test SELECT * FROM hdfs_import_test_external_table;次の結果が返されます。
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** | +---------------------------------------+job_idに基づいて非同期タスクのステータスを確認することもできます。 詳細については、「非同期でのインポートタスクの送信」をご参照ください。
次のステップ
インポートが完了したら、AnalyticDB for MySQL クラスターの adb_demo ターゲットデータベースにログインします。 次の文を実行して、データがソーステーブルから adb_hdfs_import_test ターゲットテーブルにインポートされたことを確認します。
SELECT * FROM adb_hdfs_import_test LIMIT 100;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" }';パラメーター
必須
説明
ENGINE='HDFS'必須
外部テーブルのストレージエンジン。 この例では HDFS を使用します。
TABLE_PROPERTIESAnalyticDB for MySQL が HDFS データにアクセスする方法。
formatデータファイルの形式。 CSV ファイルの外部テーブルを作成するには、このパラメーターを
csvに設定します。delimiterCSV データファイルの列区切り文字。 この例ではコンマ (,) を使用します。
hdfs_urlHDFS クラスター内のターゲットデータファイルまたはフォルダーの絶対アドレス。 アドレスは
hdfs://で始まる必要があります。例:
hdfs://172.17.***.***:9000/adb/hdfs_import_test_csv_data/hdfs_import_test_data.csvpartition_columnオプション
外部テーブルのパーティションキー列。 複数の列はコンマ (,) で区切ります。 パーティションキー列の定義方法については、「パーティション化された HDFS 外部テーブルの作成」をご参照ください。
compress_typeデータファイルの圧縮タイプ。 CSV ファイルは Gzip 圧縮タイプのみをサポートします。
skip_header_line_countデータインポート中にファイルの先頭でスキップするヘッダー行の数。 CSV ファイルの最初の行はテーブルヘッダーです。 このパラメーターを 1 に設定すると、データインポート中に最初の行が自動的にスキップされます。
デフォルト値は 0 で、行はスキップされません。
hdfs_ha_host_portHDFS クラスターに高可用性 (HA) 機能が設定されている場合は、外部テーブルを作成するときに
hdfs_ha_host_portパラメーターを設定します。 形式はip1:port1,ip2:port2です。 IP アドレスとポートは、プライマリおよびセカンダリのnamenodeインスタンス用です。例:
192.168.xx.xx:8020,192.168.xx.xx:8021Parquet または ORC ファイル用の外部テーブルの作成
次の文は、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/" }';パラメーター
必須
説明
ENGINE='HDFS'必須
外部テーブルのストレージエンジン。 この例では HDFS を使用します。
TABLE_PROPERTIESAnalyticDB for MySQL が HDFS データにアクセスする方法。
formatデータファイルの形式。
Parquet ファイルの外部テーブルを作成するには、このパラメーターを
parquetに設定します。ORC ファイルの外部テーブルを作成するには、このパラメーターを
orcに設定します。
hdfs_urlHDFS クラスター内のターゲットデータファイルまたはフォルダーの絶対アドレス。 アドレスは
hdfs://で始まる必要があります。partition_columnオプション
テーブルのパーティションキー列。 複数の列はコンマ (,) で区切ります。 パーティションキー列の定義方法については、「パーティション化された HDFS 外部テーブルの作成」をご参照ください。
hdfs_ha_host_portHA 機能が HDFS クラスターに設定されている場合は、外部テーブルを作成するときに
hdfs_ha_host_portパラメーターを設定します。 形式はip1:port1,ip2:port2です。 IP アドレスとポートは、プライマリおよびセカンダリのnamenodeインスタンス用です。例:
192.168.xx.xx:8020,192.168.xx.xx:8021説明外部テーブルの `CREATE TABLE` 文の列名は、Parquet または ORC ファイルの列名と同一である必要がありますが、大文字と小文字は区別されません。 列の順序も同じである必要があります。
外部テーブルを作成するときに、Parquet または ORC ファイルから一部の列のみを選択して外部テーブルの列にすることができます。 選択されていない列はインポートされません。
外部テーブルの `CREATE TABLE` 文に Parquet または ORC ファイルに存在しない列が含まれている場合、その列のクエリは NULL を返します。
Parquet ファイルと AnalyticDB for MySQL 間のデータ型マッピング
Parquet 基本データ型
Parquet logicalType
AnalyticDB for MySQL のデータ型
BOOLEAN
None
BOOLEAN
INT32
INT_8
TINYINT
INT32
INT_16
SMALLINT
INT32
None
INT または INTEGER
INT64
None
BIGINT
FLOAT
None
FLOAT
DOUBLE
None
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
None
TIMESTAMP または DATETIME
重要Parquet ファイルの外部テーブルは
STRUCT型をサポートしていません。 この型を使用すると、テーブルの作成は失敗します。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
重要ORC ファイルの外部テーブルは、
LIST、STRUCT、UNIONなどの複雑な型をサポートしていません。 これらの型を使用すると、テーブルの作成は失敗します。 列がMAP型を使用している場合、ORC ファイルの外部テーブルを作成できますが、そのテーブルに対するクエリは失敗します。
パーティション化された HDFS 外部テーブルの作成
HDFS は、Parquet、CSV、および ORC ファイル形式でのデータのパーティション分割をサポートしています。 パーティション化されたデータは、HDFS 上に階層的なディレクトリを形成します。 次の例では、p1 はレベル 1 のパーティション、p2 はレベル 2 のパーティション、p3 はレベル 3 のパーティションです。
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", // CSV または ORC ファイルの外部テーブルを作成するには、format の値を csv または orc に変更します。
"partition_column":"p1, p2, p3" // パーティション化された HDFS データの場合、パーティションごとにデータをクエリするには、AnalyticDB for MySQL にデータをインポートするときに、CREATE EXTERNAL TABLE 文で partition_column パラメーターを指定する必要があります。
}';TABLE_PROPERTIESのpartition_columnパラメーターは、p1、p2、p3 などのパーティションキー列を指定します。 パーティションキー列は、レベル 1 からレベル 3 のパーティションの順にpartition_columnパラメーターで宣言する必要があります。列定義には、p1、p2、p3 などのパーティションキー列とそのデータ型を含める必要があります。 パーティションキー列は、列定義の最後に配置する必要があります。
列定義内のパーティションキー列の順序は、
partition_columnパラメーター内の順序と一致する必要があります。パーティションキー列は、次のデータ型をサポートしています:
BOOLEAN、TINYINT、SMALLINT、INT、INTEGER、BIGINT、FLOAT、DOUBLE、DECIMAL、VARCHAR、STRING、DATE、およびTIMESTAMP。データをクエリすると、パーティションキー列は他のデータ列と同じように表示および使用されます。
形式を指定しない場合、デフォルトの形式は CSV です。
他のパラメーターの詳細については、「パラメーターの説明」をご参照ください。