AnalyticDB for MySQL は、外部テーブルを使用して外部データをインポートすることをサポートしています。このトピックでは、OSS から AnalyticDB for MySQL クラスターにデータをインポートする方法について説明します。
前提条件
AnalyticDB for MySQL クラスターと OSS バケットが同一リージョン内にある必要があります。詳細については、「OSS の有効化」をご参照ください。
データファイル を OSS ディレクトリにアップロード済みである必要があります。
エラスティックネットワークインターフェース (ENI) アクセスは、AnalyticDB for MySQL データウェアハウスエディション クラスターで有効になっています。
重要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、maxlinelength、およびpartition_columnパラメーターのみがサポートされます。Parquet 形式:
endpoint、url、accessid、accesskey、format、maxlinelength、およびpartition_columnパラメーターのみがサポートされます。ORC 形式:
endpoint、url、accessid、accesskey、format、maxlinelength、および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 | 条件付き必須 | ファイル形式。
| |
maxlinelength | いいえ | デフォルト値:32768 (32 KB)。データファイルにこの長さを超える行が含まれている場合、このパラメーターを増やすことができます。 例: | |
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
}';Hive TEXT ファイルを読み取るために CSV 形式の OSS 外部テーブルを作成する際の注意点:
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 |