AnalyticDB for MySQL では、外部テーブルを使用して外部データをインポートできます。このトピックでは、外部テーブルを使用して OSS から AnalyticDB for MySQL クラスターにデータをインポートする方法について説明します。
前提条件
AnalyticDB for MySQL クラスターと OSS バケットは同じリージョンにあります。詳細については、「OSS のアクティブ化」をご参照ください。
AnalyticDB for MySQL Data Lakehouse Edition クラスターで Elastic Network Interface (ENI) アクセスが有効になっています。
重要AnalyticDB for MySQL コンソールにログインします。[クラスター情報] ページで、[ネットワーク情報] セクションの Elastic Network Interface (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 手順
Enterprise Edition、Basic Edition、および Data Lakehouse Edition
SQL エディターに移動します。
AnalyticDB for MySQL コンソールにログインします。コンソールの左上隅でリージョンを選択します。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。管理するクラスターを見つけて、クラスター ID をクリックします。
左側のナビゲーションウィンドウで、 をクリックします。
データをインポートします。
通常のインポート (デフォルト) メソッドまたはエラスティックインポートメソッドを使用してデータをインポートできます。通常のインポートメソッドは、計算ノードでソースデータを読み取り、ストレージノードにインデックスを構築します。このメソッドは、コンピューティングリソースとストレージリソースを消費します。エラスティックインポートメソッドは、サーバーレス Spark ジョブでソースデータを読み取り、インデックスを構築します。このメソッドは、ジョブタイプリソースグループのリソースを消費します。エラスティックインポートメソッドは、Enterprise Edition、Basic Edition、および Data Lakehouse Edition の Milvus バージョン 3.1.10.0 以降を実行し、ジョブタイプリソースグループを持つクラスターでのみサポートされます。詳細については、「データインポートメソッド」をご参照ください。
通常のインポート
外部データベースを作成します。
CREATE EXTERNAL DATABASE adb_external_db;外部テーブルを作成します。CREATE EXTERNAL TABLE 文を使用して、
adb_external_dbデータベースに OSS 外部テーブルを作成します。この例では、外部テーブルの名前は 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;OSS からインポートされたデータを格納するために AnalyticDB for MySQL にテーブルを作成します。次の文に例を示します。
説明作成する内部テーブルには、外部テーブルと同じフィールド名、フィールド数、フィールド順序、およびフィールドタイプが必要です。
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)OSS からインポートされたデータを格納するために AnalyticDB for MySQL にテーブルを作成します。次の文に例を示します。
説明作成する内部テーブルには、外部テーブルと同じフィールド名、フィールド数、フィールド順序、およびフィールドタイプが必要です。
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を使用して非同期ジョブを送信した後、返される結果はジョブが正常に送信されたことのみを示します。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 の場合、送信されたインポートタスクは通常のインポートタスクです。
Data Lakehouse Edition
クラスターに接続し、データベースを作成します。
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 形式で大量のデータを含む外部テーブルをクエリすると、高いパフォーマンスオーバーヘッドが発生する可能性があります。クエリ効率を向上させるには、次の手順で説明するように、OSS 外部テーブルから AnalyticDB for MySQL にデータをインポートします。
SELECT * FROM oss_import_test_external_table;OSS 外部テーブルからインポートされたデータを格納するために AnalyticDB for MySQL にテーブルを作成します。
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
Enterprise Edition、Basic Edition、および Data Lakehouse Edition の OSS 外部テーブルの構文と説明の詳細については、「OSS 外部テーブル」をご参照ください。
Data Lakehouse Edition
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 アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ID。 AccessKey ID の取得方法については、「アカウントと権限」をご参照ください。 | ||
accesskey | OSS 管理権限を持つ Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey Secret。 AccessKey Secret を取得するには、「アカウントと権限」をご参照ください。 | ||
format | 条件付きで必須 | データファイルの形式。
| |
CSV および Text 形式の外部テーブル | delimiter|field_delimiter | はい | データファイルの列区切り文字。
|
CSV 形式の外部テーブル | null_value | いいえ | CSV データファイルの 重要 このパラメーターは、Milvus バージョン 3.1.4.2 以降のクラスターでのみサポートされます。 |
ossnull | CSV データファイルで
説明 上記の例では、 | ||
skip_header_line_count | データインポート中にデータファイルの先頭でスキップするヘッダー行の数。CSV ファイルの最初の行がテーブルヘッダーである場合、このパラメーターを 1 に設定して、データインポート中にヘッダー行をスキップできます。 デフォルト値: 0。この値は、行がスキップされないことを示します。 | ||
oss_ignore_quote_and_escape | フィールド値の引用符とエスケープ文字を無視するかどうかを指定します。デフォルト値: false。この値は、引用符とエスケープ文字が無視されないことを示します。 重要 このパラメーターは、Milvus バージョン 3.1.4.2 以降のクラスターでのみサポートされます。 | ||
charset | OSS 外部テーブルの文字セット。有効な値:
重要 このパラメーターは、Milvus バージョン 3.1.10.4 以降のクラスターでのみサポートされます。 |
外部テーブルの `CREATE TABLE` 文の列名は、Parquet または ORC ファイルの列名と同じである必要がありますが、大文字と小文字は区別されません。列の順序も同じである必要があります。
外部テーブルを作成するときに、Parquet または ORC ファイルから一部の列のみを選択して外部テーブルの列にすることができます。選択されていない列はインポートされません。
外部テーブルの `CREATE TABLE` 文に Parquet または ORC ファイルに存在しない列が含まれている場合、その列のクエリは NULL を返します。
AnalyticDB for MySQL は、OSS 上の CSV 形式の外部テーブルを使用して 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 外部テーブルを使用して Hive TEXT ファイルを読み書きするには、delimiterパラメーターを設定する際に、デリミタを\\1としてエスケープする必要があります。Hive TEXT ファイルのデフォルトの
NULL値は\Nです。OSS 上の CSV 形式の外部テーブルを使用して Hive TEXT ファイルを読み書きするには、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 logicalType | AnalyticDB for MySQL データの型 |
BOOLEAN | None | BOOLEAN |
INT32 | INT_8 | TINYINT |
INT32 | INT_16 | SMALLINT |
INT32 | None | INT or INTEGER |
INT64 | None | BIGINT |
FLOAT | None | FLOAT |
DOUBLE | None | DOUBLE |
| DECIMAL | DECIMAL |
BINARY | UTF-8 |
|
INT32 | DATE | DATE |
INT64 | TIMESTAMP_MILLIS | TIMESTAMP or DATETIME |
INT96 | None | TIMESTAMP or DATETIME |
ORC ファイルと AnalyticDB for MySQL のデータ型マッピング
ORC ファイルデータの型 | AnalyticDB for MySQL データの型 |
BOOLEAN | BOOLEAN |
BYTE | TINYINT |
SHORT | SMALLINT |
INT | INT or INTEGER |
LONG | BIGINT |
DECIMAL | DECIMAL |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
|
|
TIMESTAMP | TIMESTAMP or 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 |