AnalyticDB for MySQL は、外部テーブルを使用して外部データをインポートすることをサポートしています。このトピックでは、OSS から AnalyticDB for MySQL クラスターにデータをインポートする方法について説明します。
前提条件
-
AnalyticDB for MySQL クラスターと OSS バケットが同一リージョン内に存在している必要があります。詳細については、「OSS の有効化」をご参照ください。
-
データファイルを OSS ディレクトリ にアップロードしました。
-
ご利用の AnalyticDB for MySQL Data Warehouse Edition クラスターで、エラスティックネットワークインターフェース (ENI) アクセスが有効になっている必要があります。
重要-
AnalyticDB for MySQL コンソール にログインします。クラスター情報 ページの ネットワーク情報 セクションで、ENI ネットワークスイッチをオンにします。
-
ENI ネットワークの有効化または無効化を行うと、約 2 分間データベース接続が中断され、読み取りおよび書き込み操作ができなくなります。ENI ネットワークを有効化または無効化する前に、影響を慎重に評価してください。
-
データ準備
この例では、データファイル person.csv を OSS 内の testBucketName/adb/dt=2023-06-15 ディレクトリにアップロードします。ファイルは改行を行区切り文字として使用し、カンマ (,) を列区切り文字として使用します。person.csv ファイルには以下のサンプルデータが含まれています。
1,james,10,2023-06-15
2,bond,20,2023-06-15
3,jack,30,2023-06-15
4,lucy,40,2023-06-15
操作手順
エンタープライズ、ベーシック、およびデータレイクハウス エディション
-
SQL 開発エディターに移動します。
AnalyticDB for MySQL コンソール にログインします。コンソール左上隅でリージョンを選択し、左側ナビゲーションウィンドウで クラスターリスト をクリックします。管理対象のクラスターを見つけ、クラスター ID をクリックします。
-
左側ナビゲーションウィンドウで、 を選択します。
-
データをインポートします。
通常インポート(デフォルト)またはエラスティックインポートのいずれかを使用してデータをインポートできます。通常インポートモードでは、システムがコンピュートノードからソースデータを読み取り、ストレージノードでインデックスを作成するため、コンピュートリソースとストレージリソースの両方を消費します。 エラスティックインポート方式は、カーネルバージョン 3.1.10.0 以降を実行し、ジョブタイプのリソースグループを持つ Enterprise Edition、Basic Edition、および Data Lakehouse Edition クラスターでのみサポートされています。詳細については、「データインポート方法」をご参照ください。
通常インポート
-
外部データベースを作成します。
CREATE EXTERNAL DATABASE adb_external_db; -
外部テーブルを作成します。
adb_external_db外部データベース内に OSS 外部テーブルを作成するために、CREATE EXTERNAL TABLE 文を使用します。このトピックでは adb_external_db.person を例として使用します。説明AnalyticDB for MySQL の外部テーブルは、ソース OSS ファイルとフィールド名、フィールド数、フィールド順序、データ型が一致している必要があります。
OSS 外部テーブルの作成構文の詳細については、「CREATE EXTERNAL TABLE」をご参照ください。
-
データをクエリします。
外部テーブルを作成後、AnalyticDB for MySQL で SELECT 文を実行して OSS からデータをクエリできます。
SELECT * FROM adb_external_db.person;以下の結果が返されます。
+------+-------+------+-----------+ | id | name | age | dt | +------+-------+------+-----------+ | 1 | james | 10 |2023-06-15 | | 2 | bond | 20 |2023-06-15 | | 3 | jack | 30 |2023-06-15 | | 4 | lucy | 40 |2023-06-15 | +------+-------+------+-----------+ -
AnalyticDB for MySQL にデータベースを作成します。既にデータベースが存在する場合は、このステップをスキップできます。以下の文を例として示します。
CREATE DATABASE adb_demo; -
AnalyticDB for MySQL に、インポートされた OSS データを格納するためのテーブルを作成します。以下の文を例として示します。
説明内部テーブルは、ステップ b の外部テーブルとフィールド名、フィールド数、フィールド順序、データ型が一致している必要があります。
CREATE TABLE IF NOT EXISTS adb_demo.adb_import_test( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id); -
テーブルにデータをインポートします。
-
方法 1:
INSERT INTO文を使用します。プライマリキーが重複する場合、新しいデータは無視されます。これはINSERT IGNORE INTOと同等です。詳細については、「INSERT INTO」をご参照ください。例:INSERT INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person; -
方法 2:
INSERT OVERWRITE INTO文を使用してデータを同期的にインポートします。これにより、テーブル内の既存データが上書きされます。例:INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person; -
方法 3:
INSERT OVERWRITE INTO文を使用してデータを非同期的にインポートします。詳細については、「非同期書き込み」をご参照ください。例:SUBMIT JOB INSERT OVERWRITE adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
-
エラスティックインポート
-
データベースを作成します。既にデータベースが存在する場合は、このステップをスキップできます。以下の文を例として示します。
CREATE DATABASE adb_demo; -
外部テーブルを作成します。
説明-
AnalyticDB for MySQL の外部テーブルは、ソース OSS ファイルとフィールド名、フィールド数、フィールド順序、データ型が一致している必要があります。
-
エラスティックインポートでは、
CREATE TABLE文を使用した外部テーブルの作成のみがサポートされています。
CREATE TABLE oss_import_test_external_table ( id INT(1023), name VARCHAR(1023), age INT, dt VARCHAR(1023) ) ENGINE='OSS' TABLE_PROPERTIES='{ "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com", "url":"oss://testBucketName/adb/dt=2023-06-15/person.csv", "accessid":"accesskey_id", "accesskey":"accesskey_secret", "delimiter":"," }';重要外部テーブル作成時にサポートされる TABLE_PROPERTIES パラメーターは、ファイル形式 (CSV、Parquet、ORC) によって異なります。
-
CSV 形式:
endpoint、url、accessid、accesskey、format、delimiter、null_value、およびpartition_columnパラメーターのみがサポートされています。 -
Parquet 形式:
endpoint、url、accessid、accesskey、format、およびpartition_columnパラメーターのみがサポートされています。 -
ORC 形式:
endpoint、url、accessid、accesskey、format、およびpartition_columnパラメーターのみがサポートされています。
外部テーブルで設定可能なパラメーターとその説明の詳細については、「OSS パーティションなし外部テーブル」および「OSS パーティション付き外部テーブル」をご参照ください。
-
-
データをクエリします。
外部テーブルを作成後、AnalyticDB for MySQL で SELECT 文を実行して OSS からデータをクエリできます。
SELECT * FROM oss_import_test_external_table;以下の結果が返されます。
+------+-------+------+-----------+ | id | name | age | dt | +------+-------+------+-----------+ | 1 | james | 10 |2023-06-15 | | 2 | bond | 20 |2023-06-15 | | 3 | jack | 30 |2023-06-15 | | 4 | lucy | 40 |2023-06-15 | +------+-------+------+-----------+ 4 rows in set (0.35 sec) -
AnalyticDB for MySQL に、インポートされた OSS データを格納するためのテーブルを作成します。以下の文を例として示します。
説明内部テーブルは、ステップ b の外部テーブルとフィールド名、フィールド数、フィールド順序、データ型が一致している必要があります。
CREATE TABLE adb_import_test ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id); -
データをインポートします。
重要エラスティックインポートでは、
INSERT OVERWRITE INTO文を使用したデータのインポートのみがサポートされています。-
方法 1:INSERT OVERWRITE INTO 文を実行してデータをエラスティックインポートし、テーブル内の既存データを上書きします。以下の文を例として示します。
/*+elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/ INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_demo.oss_import_test_external_table;
-
方法 2:INSERT OVERWRITE INTO 文を非同期的に実行してデータをエラスティックインポートします。
SUBMIT JOB文を使用して、バックグラウンドでスケジュールされる非同期タスクを送信できます。/*+elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/ SUBMIT JOB INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_demo.oss_import_test_external_table;重要非同期でエラスティックインポートタスクを送信する際、優先度付きキューを設定することはできません。
以下の結果が返されます。
+---------------------------------------+ | job_id | +---------------------------------------+ | 202308151719510210170190********** |
SUBMIT JOBを使用して非同期タスクを送信すると、返される結果はタスクが正常に送信されたことのみを示します。ジョブ ID を使用して非同期タスクを終了したり、ステータスをクエリしてタスクが正常に実行されたかどうかを確認したりできます。詳細については、「非同期インポートジョブの送信」をご参照ください。ヒントパラメーター:
-
elastic_load:エラスティックインポートを使用するかどうかを指定します。有効な値:true および false。デフォルト値:false。
-
elastic_load_configs:エラスティックインポート機能の構成パラメーターです。パラメーターは角括弧 ([ ]) で囲み、複数のパラメーターを縦棒 (|) で区切る必要があります。以下の表にパラメーターを示します。
パラメーター
必須
説明
adb.load.resource.group.name
はい
エラスティックインポートジョブを実行するジョブリソースグループの名前。
adb.load.job.max.acu
いいえ
エラスティックインポートジョブの最大リソース量。単位:AnalyticDB 計算ユニット (ACU)。最小値:5 ACU。デフォルト値:シャード数 + 1。
クラスターのシャード数をクエリするには、以下の文を実行します。
SELECT count(1) FROM information_schema.kepler_meta_shards;spark.driver.resourceSpec
いいえ
Spark ドライバーのリソースタイプ。 デフォルト値:small。有効な値については、「Conf 構成パラメーター」トピックの「Spark アプリケーション構成パラメーター」表の「Type」列をご参照ください。
spark.executor.resourceSpec
いいえ
Spark エグゼキューターのリソースタイプ。 デフォルト値:large。有効な値については、「Conf 構成パラメーター」トピックの「Spark アプリケーション構成パラメーター」表の「Type」列をご参照ください。
spark.adb.executorDiskSize
いいえ
Spark エグゼキューターのディスク容量。有効な値:(0,100]。単位:GiB。デフォルト値:10 GiB。詳細については、「Conf 構成パラメーター」トピックの「ドライバーおよびエグゼキューターリソースの指定」セクションをご参照ください。
-
-
(オプション)送信されたインポートタスクがエラスティックインポートタスクかどうかを確認します。
SELECT job_name, (job_type = 3) AS is_elastic_load FROM INFORMATION_SCHEMA.kepler_meta_async_jobs where job_name = "2023081818010602101701907303151******";以下の結果が返されます。
+---------------------------------------+------------------+ | job_name | is_elastic_load | +---------------------------------------+------------------+ | 20230815171951021017019072*********** | 1 | +---------------------------------------+------------------+is_elastic_loadの値が 1 の場合、送信されたインポートタスクはエラスティックインポートタスクです。値が 0 の場合、タスクは通常インポートタスクです。
-
データウェアハウス エディション
-
クラスターに接続 してデータベースを作成します。
CREATE DATABASE adb_demo; -
外部テーブルを作成します。CREATE TABLE 構文を使用して、CSV、Parquet、または ORC 形式の OSS 外部テーブルを作成します。構文の詳細については、「OSS 外部テーブル構文」をご参照ください。
このトピックでは、CSV 形式のパーティションなし外部テーブルを例として使用します。
CREATE TABLE IF NOT EXISTS oss_import_test_external_table ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) ENGINE='OSS' TABLE_PROPERTIES='{ "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com", "url":"oss://testBucketname/adb/dt=2023-06-15/person.csv", "accessid":"accesskey_id", "accesskey":"accesskey_secret", "delimiter":",", "skip_header_line_count":0, "charset":"utf-8" }'; -
oss_import_test_external_table外部テーブルからデータをクエリします。説明CSV、Parquet、または ORC データファイルの場合、大規模な外部テーブルをクエリすると、パフォーマンスに大きなオーバーヘッドが発生する可能性があります。クエリ効率を向上させるため、ステップ 4 および 5 で説明されているように、OSS 外部テーブルから AnalyticDB for MySQL にデータをインポートしてからクエリを実行することを推奨します。
SELECT * FROM oss_import_test_external_table; -
AnalyticDB for MySQL に、OSS 外部テーブルからインポートされたデータを格納するためのテーブルを作成します。
CREATE TABLE IF NOT EXISTS adb_oss_import_test ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id); -
INSERT 文を実行して、OSS 外部テーブルから AnalyticDB for MySQL にデータをインポートします。
重要INSERT INTOまたはINSERT OVERWRITE SELECTを使用したデータインポート操作は、デフォルトで同期的に実行されます。数百ギガバイトなどの大規模データセットの場合、クライアントは長時間にわたり AnalyticDB for MySQL サーバーとの持続的接続を維持する必要があります。この間、ネットワークの問題により接続が中断され、インポートが失敗する可能性があります。そのため、大規模なデータ量の場合は、SUBMIT JOB INSERT OVERWRITE SELECTを使用して非同期的にインポートすることを推奨します。-
方法 1:
INSERT INTO文を実行してデータをインポートします。プライマリキーが重複する場合、現在の書き込み操作は無視され、データは更新されません。この動作はINSERT IGNORE INTOと同等です。詳細については、「INSERT INTO」をご参照ください。以下の文を例として示します。INSERT INTO adb_oss_import_test SELECT * FROM oss_import_test_external_table; -
方法 2:INSERT OVERWRITE 文を実行してデータをインポートし、テーブル内の既存データを上書きします。以下の文を例として示します。
INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table; -
方法 3:
INSERT OVERWRITE文を非同期的に実行してデータをインポートします。SUBMIT JOBを使用して、バックグラウンドでスケジュールされる非同期タスクを送信できます。書き込みタスクの前にヒント (/*+ direct_batch_load=true*/) を追加して、タスクを高速化できます。詳細については、「非同期書き込み」をご参照ください。以下の文を例として示します。SUBMIT JOB INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table;以下の結果が返されます。
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** |非同期タスクの送信方法の詳細については、「非同期インポートジョブの送信」をご参照ください。
-
OSS 外部テーブル構文
エンタープライズ、ベーシック、およびデータレイクハウス
Enterprise Edition、Basic Edition、および Data Lakehouse Edition における OSS 外部テーブルの作成構文については、「OSS 外部テーブル」をご参照ください。
データウェアハウス
OSS パーティションなし外部テーブル
CREATE TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='OSS'
TABLE_PROPERTIES='{
"endpoint":"endpoint",
"url":"OSS_LOCATION",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
"format":"csv|orc|parquet|text
"delimiter|field_delimiter":";",
"skip_header_line_count":1,
"charset":"utf-8"
}';
|
外部テーブルタイプ |
パラメーター |
必須 |
説明 |
|
CSV、Parquet、および ORC 形式の外部テーブル |
ENGINE='OSS' |
はい |
テーブルエンジン。値を OSS に設定します。 |
|
endpoint |
OSS バケットの エンドポイント。AnalyticDB for MySQL は現在、VPC ネットワーク経由でのみ OSS にアクセスできます。 説明
OSS コンソール にログインし、対象のバケットをクリックして、バケットの 概要 ページで エンドポイント を確認します。 |
||
|
url |
OSS ファイルまたはディレクトリへのパス。
|
||
|
accessid |
OSS 管理権限を持つ Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID。 AccessKey ID の取得方法については、「アカウントと権限」をご参照ください。 |
||
|
accesskey |
OSS 管理権限を持つ Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey Secret。 AccessKey Secret の取得方法については、「アカウントと権限」をご参照ください。 |
||
|
format |
条件付き必須 |
ファイル形式。
|
|
|
CSV および Text 形式の外部テーブル |
delimiter|field_delimiter |
はい |
データファイルの列区切り文字。
|
|
CSV 形式の外部テーブル |
null_value |
いいえ |
CSV データファイル内で 重要
このパラメーターには、カーネルバージョン 3.1.4.2 以降のクラスターが必要です。 |
|
ossnull |
CSV データファイル内の
説明
上記の例は、 |
||
|
skip_header_line_count |
データファイルの先頭からスキップする行数。たとえば、CSV ファイルにヘッダー行がある場合、これをスキップするためにこのパラメーターを 1 に設定します。 デフォルト値は 0 で、スキップする行がないことを示します。 |
||
|
oss_ignore_quote_and_escape |
true に設定すると、フィールド値内の引用符とエスケープ文字が無視されます。デフォルトは false です。 重要
このパラメーターには、カーネルバージョン 3.1.4.2 以降のクラスターが必要です。 |
||
|
charset |
OSS 外部テーブルの文字セット。有効な値:
重要
このパラメーターには、カーネルバージョン 3.1.10.4 以降のクラスターが必要です。 |
-
CREATE EXTERNAL TABLE 文のカラム名とその順序は、ソース Parquet または ORC ファイル内のものと一致している必要があります。カラム名は大文字と小文字を区別しません。
-
ソースファイルのカラムのサブセットを使用して外部テーブルを作成できます。CREATE EXTERNAL TABLE 文で指定されていないカラムは無視されます。
-
CREATE EXTERNAL TABLE 文に、Parquet または ORC ファイルに存在しないカラムが含まれている場合、そのカラムに対するクエリは NULL を返します。
AnalyticDB for MySQL は、CSV 形式の OSS 外部テーブルを使用して Hive TEXT ファイルの読み取りおよび書き込みが可能です。テーブルを作成するには、以下の文を使用します。
CREATE TABLE adb_csv_hive_format_oss (
a tinyint,
b smallint,
c int,
d bigint,
e boolean,
f float,
g double,
h varchar,
i varchar, -- binary
j timestamp,
k DECIMAL(10, 4),
l varchar, -- char(10)
m varchar, -- varchar(100)
n date
) ENGINE = 'OSS' TABLE_PROPERTIES='{
"format": "csv",
"endpoint":"oss-cn-hangzhou-internal.aliyuncs.com",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
"url":"oss://testBucketname/adb_data/",
"delimiter": "\\1",
"null_value": "\\\\N",
"oss_ignore_quote_and_escape": "true",
"ossnull": 2
}';
CSV 形式の OSS 外部テーブルを作成して Hive TEXT ファイルを読み取る際の注意点を以下に示します。
-
Hive TEXT ファイルのデフォルトの列区切り文字は
\1です。CSV 形式の OSS 外部テーブルを使用してこれらのファイルを読み取りまたは書き込みするには、delimiterパラメーターをエスケープされた値\\1に設定する必要があります。 -
Hive TEXT ファイルのデフォルトの
NULL値は\Nです。CSV 形式の OSS 外部テーブルを使用してこれらのファイルを読み取りまたは書き込みするには、null_valueパラメーターをエスケープされた値\\\\Nに設定する必要があります。 -
BOOLEANなどの他の基本的な Hive データ型は、AnalyticDB for MySQL データ型に直接マッピングされます。ただし、BINARY、CHAR(n)、およびVARCHAR(n)型はすべて、AnalyticDB for MySQL のVARCHAR型にマッピングされます。
付録:データ型マッピング
-
テーブル作成時に指定するデータ型は、以下の表のマッピングと一致している必要があります。
DECIMAL型の場合、精度も一致している必要があります。 -
Parquet 外部テーブルは
STRUCT型をサポートしていません。この型を使用すると、テーブル作成が失敗します。 -
ORC 外部テーブルは、
LIST、STRUCT、およびUNIONなどの複合型をサポートしていません。これらの型を使用すると、テーブル作成が失敗します。MAP型のカラムを含む ORC 外部テーブルを作成することは可能ですが、そのテーブルに対するクエリは失敗します。
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 |
|
DECIMAL |
DECIMAL |
|
BINARY |
UTF-8 |
|
|
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 |
|
|
|
TIMESTAMP |
TIMESTAMP または DATETIME |
|
DATE |
DATE |
Paimon ファイルと AnalyticDB for MySQL のデータ型マッピング
|
Paimon 型 |
AnalyticDB for MySQL 型 |
|
CHAR |
VARCHAR |
|
VARCHAR |
VARCHAR |
|
BOOLEAN |
BOOLEAN |
|
BINARY |
VARBINARY |
|
VARBINARY |
VARBINARY |
|
DECIMAL |
DECIMAL |
|
TINYINT |
TINYINT |
|
SMALLINT |
SMALLINT |
|
INT |
INTEGER |
|
BIGINT |
BIGINT |
|
FLOAT |
REAL |
|
DOUBLE |
DOUBLE |
|
DATE |
DATE |
|
TIME |
サポートされていません |
|
TIMESTAMP |
TIMESTAMP |
|
LocalZonedTIMESTAMP |
TIMESTAMP (ローカルタイムゾーン情報は無視) |
|
ARRAY |
ARRAY |
|
MAP |
MAP |
|
ROW |
ROW |