AnalyticDB for MySQL では、OSS 外部テーブル、RDS for MySQL 外部テーブル、ApsaraDB for MongoDB 外部テーブル、Tablestore 外部テーブル、MaxCompute 外部テーブルなど、いくつかのタイプの外部テーブルを作成できます。
前提条件
AnalyticDB for MySQL の Enterprise Edition、Basic Edition、または Data Lakehouse Edition のクラスターが作成されていること。
クラスターのマイナーバージョンが 3.1.8.0 以降であること。
説明マイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールのクラスター情報ページにある構成情報セクションに移動します。
まず外部データベースを作成する必要があります。詳細については、「CREATE EXTERNAL DATABASE」をご参照ください。
注意事項
Alibaba Cloud アカウントをまたいで作成できるのは、OSS 外部テーブルのみです。
OSS 外部テーブル
OSS バケットは、AnalyticDB for MySQL クラスターと同じリージョンにある必要があります。
Hudi、Iceberg、または Paimon の外部テーブルを作成するには、クラスターが次のマイナーバージョンの要件を満たしている必要があります。
Hudi 外部テーブル:クラスターのマイナーバージョンは 3.1.9.2 以降である必要があります。
Iceberg 外部テーブル:クラスターのマイナーバージョンは 3.2.3.0 以降である必要があります。
Paimon 外部テーブル:クラスターのマイナーバージョンは 3.2.6.1 以降である必要があります。
マイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールの クラスター情報 ページの 構成情報 セクションに移動します。
パーティション化された OSS 外部テーブルを作成した後、
MSCK REPAIR TABLE文を実行してパーティションを同期します。そうしないと、外部テーブルからデータをクエリできません。Alibaba Cloud アカウントをまたいで OSS 外部テーブルを作成するには、外部データベースを作成する際に必要なパラメーターを指定する必要があります。詳細については、「CREATE EXTERNAL DATABASE」をご参照ください。
構文
CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
[PARTITIONED BY (column_name column_type[, …])]
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS {TEXTFILE|ORC|PARQUET|JSON|RCFILE|HUDI|ICEBERG|PAIMON}
LOCATION 'OSS_LOCATION'
[TBLPROPERTIES (
'type' = 'cow|mor',
'auto.create.location' = 'true|false',
'metadata_location' = 'METADATA_LOCATION'
)];パラメーター
パラメーター | 必須 | 説明 |
| はい | テーブル名とスキーマを定義します。 テーブルと列の命名規則については、「命名規則」をご参照ください。 重要 Paimon 外部テーブルを作成する場合、テーブル名、列名、および列のデータ型は Paimon ファイル内のものと一致する必要があります。テーブルスキーマ (列名や型など) が一致しない場合、Paimon スキーマが優先されます。 |
| いいえ | パーティションキー列を指定します。このパラメーターは、パーティション化された外部テーブルを作成する場合に必須です。複数レベルのパーティションテーブルを作成するには、複数のパーティションキー列を指定します。 |
| はい | 列の区切り文字を指定します。任意の文字を指定できますが、データファイルで使用されている区切り文字と一致する必要があります。このトピックでは、カンマ (,) を例として使用します。 重要 このパラメーターは、 |
| はい | ファイル形式を指定します。 ファイル形式が .txt または .csv の場合、このパラメーターを
重要 マイナーバージョンが 3.1.8.0 以降のクラスターのみが、STRUCT データ型を使用する |
| はい | OSS ファイルまたはディレクトリのパスを指定します。 OSS ディレクトリパスを指定する場合、クエリの失敗や予期しない結果を防ぐために、次のルールに従ってください。
パーティション化された外部テーブルを作成する場合、LOCATION をパーティションの親ディレクトリに設定します。たとえば、OSS ファイルのパスが 重要
|
| いいえ | Hudi 外部テーブルのタイプ。有効な値:
重要 このパラメーターは、 |
| いいえ | OSS ファイルまたはディレクトリパスを自動的に作成するかどうかを指定します。有効な値:
重要 このパラメーターは、パーティション化された外部テーブルを作成する場合にのみ有効です。 |
| いいえ | Iceberg 外部テーブルのメタデータファイルのパスを指定します。 重要
|
例
例 1: 非パーティション化外部テーブルの作成
TEXTFILE として保存される外部テーブルを作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest1 (id INT, name STRING, age INT, city STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION 'oss://testBucketName/osstest/p1=hangzhou/p2=2023-06-13/data.csv';HUDI として保存される外部テーブルを作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest2 (id INT, name STRING, age INT, city STRING) STORED AS HUDI LOCATION 'oss://testBucketName/osstest/test' TBLPROPERTIES ('type' = 'cow');PARQUET として保存される外部テーブルを作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest3 ( A STRUCT < var1:STRING, var2:INT >) STORED AS PARQUET LOCATION 'oss://testBucketName/osstest/Parquet';ICEBERG として保存される外部テーブルを作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest4 ( user_id BIGINT) STORED AS ICEBERG LOCATION 'oss://testBucketName/osstest/no_partition_table/' TBLPROPERTIES (metadata_location='oss://testBucketName/osstest/no_partition_table/metadata/00000-a32d6136-8490-4ad2-ada3-fe2f7204199f.metadata.json');PAIMON として保存される外部テーブルを作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest5 ( a INT, b BIGINT, aCa STRING, d VARCHAR(1)) STORED AS PAIMON LOCATION 'oss://testBucketName/osstest/default.db/t1/';
例 2: パーティション化された外部テーブルの作成
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest6
(id int,
name string,
age int,
city string)
PARTITIONED BY (p2 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'oss://testBucketName/osstest/p1=hangzhou/';例 3: 複数レベルのパーティション化された外部テーブルの作成
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest7
(id int,
name string,
age int,
city string)
PARTITIONED BY (p1 string,p2 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'oss://testBucketName/osstest/';RDS for MySQL 外部テーブル
RDS for MySQL 外部テーブルを作成するには、まず AnalyticDB for MySQL コンソールの クラスター情報 ページで ENI を有効にする必要があります。ENI を有効または無効にすると、約 2 分間のデータベース接続の中断が発生し、その間、読み取りおよび書き込み操作は失敗します。ENI を有効または無効にする前に、潜在的な影響を慎重に評価してください。
RDS for MySQL インスタンスは、AnalyticDB for MySQL クラスターと同じ VPC にある必要があります。
構文
CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='MYSQL'
TABLE_PROPERTIES='{
"url":"mysql_vpc_address",
"tablename":"mysql_table_name",
"username":"mysql_user_name",
"password":"mysql_user_password"
[,"charset":"{gbk|utf8|utf8mb4}"]
}';パラメーター
パラメーター | 必須 | 説明 |
| はい | テーブル名とスキーマを定義します。 テーブルと列の命名規則については、「命名規則」をご参照ください。 |
| はい | 外部テーブルのストレージエンジン。RDS for MySQL からデータを読み書きするには、この値を MYSQL に設定します。 |
| はい | 外部テーブルのプロパティ。 |
| はい | RDS for MySQL インスタンスの VPC エンドポイント、ポート番号、およびデータベース名。VPC エンドポイントの取得方法については、「ApsaraDB RDS for MySQL インスタンスのエンドポイントとポート番号の表示と変更」をご参照ください。 |
| はい | RDS for MySQL データベース内のテーブルの名前。 |
| はい | RDS for MySQL データベースのアカウント。 |
| はい | RDS for MySQL データベースアカウントのパスワード。 |
| いいえ | MySQL 外部テーブルの文字セット。有効な値:
|
例
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.mysqltest (
id int,
name varchar(1023),
age int
) ENGINE = 'MYSQL'
TABLE_PROPERTIES = '{
"url":"jdbc:mysql://rm-bp1gx6********.mysql.rds.aliyuncs.com:3306/test_adb",
"tablename":"person",
"username":"testUserName",
"password":"testUserPassword",
"charset":"utf8"
}';ApsaraDB for MongoDB 外部テーブル
ApsaraDB for MongoDB 外部テーブルを作成するには、まずAnalyticDB for MySQL コンソールのクラスター情報 ページで ENI を有効にする必要があります。 ENI を有効または無効にすると、約 2 分間のデータベース接続の中断が発生し、その間、読み取りおよび書き込み操作は失敗します。 ENI を有効または無効にする前に、潜在的な影響を慎重に評価してください。
ApsaraDB for MongoDB インスタンスは、AnalyticDB for MySQL クラスターと同じ VPC にある必要があります。
構文
CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='MONGODB'
TABLE_PROPERTIES = '{
"mapped_name":"table",
"location":"location",
"username":"user",
"password":"password",
}';パラメーター
パラメーター | 必須 | 説明 |
| はい | テーブル名とスキーマを定義します。 テーブルと列の命名規則については、「命名規則」をご参照ください。 |
| はい | 外部テーブルのストレージエンジン。ApsaraDB for MongoDB からデータを読み書きするには、この値を MONGODB に設定します。 |
| はい | 外部テーブルのプロパティ。 |
mapped_name | はい | MongoDB コレクションの名前。 |
location | はい | ApsaraDB for MongoDB インスタンスの VPC エンドポイント。 |
username | はい | ApsaraDB for MongoDB のデータベースアカウント。 説明
ApsaraDB for MongoDB は、アカウントとパスワードをターゲットデータベースに対して検証します。VPC エンドポイントで指定されたデータベースのアカウントを使用してください。問題が発生した場合は、テクニカルサポートにお問い合わせください。 |
password | はい | ApsaraDB for MongoDB データベースアカウントのパスワード。 |
例
CREATE EXTERNAL TABLE adb_external_demo.mongodbtest (
id int,
name string,
age int
) ENGINE = 'MONGODB' TABLE_PROPERTIES ='{
"mapped_name":"person",
"location":"mongodb://testuser:****@dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717,dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717/test_mongodb",
"username":"testuser",
"password":"password",
}';Tablestore 外部テーブル
Tablestore インスタンスが VPC を使用する場合、それはご利用の AnalyticDB for MySQL クラスターと同じ VPC である必要があります。
構文
CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='OTS'
TABLE_PROPERTIES = '{
"mapped_name":"table_name",
"location":"tablestore_vpc_address"
}';パラメーター
パラメーター | 必須 | 説明 |
| はい | テーブル名とスキーマを定義します。テーブルと列の命名規則については、「命名規則」をご参照ください。 |
| はい | 外部テーブルのストレージエンジン。Tablestore からデータを読み書きするには、この値を OTS に設定します。 |
| はい | Tablestore インスタンス内のテーブル名です。Tablestore コンソールにログインし、[インスタンス管理] ページでテーブル名を見つけます。 |
| はい | Tablestore インスタンスの VPC エンドポイントです。Tablestore コンソールにログインし、[インスタンス管理] ページでインスタンスの VPC エンドポイントを確認します。 |
例
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.otstest (
id int,
name string,
age int
) ENGINE = 'OTS'
TABLE_PROPERTIES = '{
"mapped_name":"person",
"location":"https://w0****la.cn-hangzhou.vpc.tablestore.aliyuncs.com"
}';MaxCompute 外部テーブル
MaxCompute プロジェクトは、AnalyticDB for MySQL クラスターと同じリージョンにある必要があります。
MaxCompute 外部テーブルをバッチで作成するには、「IMPORT FOREIGN SCHEMA」をご参照ください。
構文
CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='ODPS'
TABLE_PROPERTIES='{
"endpoint":"endpoint",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
["partition_column":"partition_column"],
"project_name":"project_name",
"table_name":"table_name",
["auto_refresh":"true|false"],
["auto_refresh_mode":"add_only|full"]
}';パラメーター
パラメーター | 必須 | 説明 |
| はい | テーブル名とスキーマを定義します。テーブルスキーマにはパーティションキー列を含める必要があります。
説明 マイナーバージョン 3.2.1.0 以降は、複雑な MaxCompute データ型をサポートします。複雑なデータ型の詳細については、「複雑なデータ型」をご参照ください。 AnalyticDB for MySQL クラスターのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。 |
| はい | 外部テーブルのストレージエンジン。MaxCompute からデータを読み書きするには、この値を ODPS に設定します。 |
| はい | MaxCompute サービスのエンドポイント。 説明 MaxCompute には VPC エンドポイント経由でのみアクセスできます。MaxCompute エンドポイントを表示するには、「エンドポイント」をご参照ください。 |
| はい | MaxCompute へのアクセス権限を持つ Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID。 AccessKey ID と AccessKey Secret の取得方法については、「AccessKey ペアの取得」をご参照ください。 |
| はい | Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey Secret。 AccessKey ID と AccessKey Secret の取得方法については、「AccessKey ペアの取得」をご参照ください。 |
| いいえ | パーティションキー列。このパラメーターは、MaxCompute テーブルがパーティションテーブルの場合に必須です。 |
| はい | MaxCompute プロジェクトの名前。 |
| はい | MaxCompute プロジェクト内のテーブルの名前。 |
| いいえ | 現在の MaxCompute 外部テーブルの自動スキーマ更新を有効にするかどうかを指定します。有効な値:
重要
|
| いいえ | スキーマ更新モード。このパラメーターは、
重要 マイナーバージョン 3.2.7.0 以降のクラスターでのみサポートされます。 |
例
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.mctest (
id int,
name varchar(1023),
age int,
dt string
) ENGINE='ODPS'
TABLE_PROPERTIES='{
"accessid":"LTAI****************",
"endpoint":"http://service.cn-hangzhou.maxcompute.aliyun.com/api",
"accesskey":"yourAccessKeySecret",
"partition_column":"dt",
"project_name":"test_adb",
"table_name":"person"
}';自動スキーマ更新 (auto refresh)
MaxCompute 外部テーブルは、自動スキーマ更新をサポートしています。有効にすると、MaxCompute ソーステーブルのスキーマの変更が、外部テーブルを再作成したり手動で更新したりすることなく、各更新サイクルで外部テーブルに自動的に同期されます。有効にするかどうか、および更新の範囲は、テーブルを作成するときに指定する auto_refresh および auto_refresh_mode パラメーターによって制御されます。詳細については、上記のパラメーターをご参照ください。
クラスターレベルの構成
テーブルレベルの auto_refresh=true 設定を使用して自動スキーマ更新を有効にする前に、次の文を実行してクラスターレベルの自動更新スイッチを有効にする必要があります。
-- 自動スキーマ更新機能を有効にします。
SET ADB_CONFIG external_table_schema_refresh_enabled=true;
-- 自動スキーマ更新のポーリング間隔 (ミリ秒単位)。デフォルト値: 300000 (5 分)。この構成は、クラスターを再起動した後に有効になります。
SET ADB_CONFIG external_table_schema_refresh_poll_interval_ms=300000;例
次の例では、add_only モードで自動スキーマ更新が有効になっている MaxCompute 外部テーブルを作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.mctest_add_only (
id BIGINT,
name VARCHAR(1024),
amount DOUBLE
) ENGINE='ODPS'
TABLE_PROPERTIES='{
"accessid":"LTAI****************",
"accesskey":"yourAccessKeySecret",
"endpoint":"https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api",
"project_name":"test_adb",
"table_name":"person",
"auto_refresh":"true",
"auto_refresh_mode":"add_only"
}';MaxCompute ソーステーブルに列が追加されると、外部テーブルは次の更新後に対応する列を自動的に追加します。ソーステーブルで削除された列や列の型の変更は自動的に適用されません。
次の例では、full モードで自動スキーマ更新が有効になっている MaxCompute 外部テーブルを作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.mctest_full (
id BIGINT,
name VARCHAR(1024),
amount DOUBLE
) ENGINE='ODPS'
TABLE_PROPERTIES='{
"accessid":"LTAI****************",
"accesskey":"yourAccessKeySecret",
"endpoint":"https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api",
"project_name":"test_adb",
"table_name":"person",
"auto_refresh":"true",
"auto_refresh_mode":"full"
}';MaxCompute ソーステーブルで列が追加、削除、または型が変更されると、外部テーブルは次の更新後にメタデータを同期します。
注意事項
自動スキーマ更新は、
ENGINE='ODPS'を使用する MaxCompute 外部テーブルでのみサポートされます。add_only はデフォルトモードであり、列の追加のみが許可される本番環境に適しています。
full モードは、削除された列と列の型の変更を自動的に同期します。これは、古い列に依存する SQL 文、アプリケーション、レポート、またはビューに影響を与える可能性があります。このモードは注意して使用してください。
MaxCompute 外部テーブルで
*を使用するビューを作成した場合 (例:CREATE VIEW view_name AS SELECT * FROM external_table)、*はビューの作成時に展開され、固定の列リストとして保存されます。full モードがソーステーブルから削除または名前変更された列を同期し、その変更がビューに保存されている列に関係する場合、ビューをクエリすると、ビューが古く、再作成する必要があることを示すエラーが返されます。これは予期された動作です。ビューで*を使用しないことを推奨します。詳細については、「CREATE VIEW」をご参照ください。
関連ドキュメント
OSS 外部テーブル:外部テーブルを使用して OSS からデータをインポートする。
RDS for MySQL 外部テーブル:外部テーブルを使用して RDS for MySQL からデータをインポートする。
ApsaraDB for MongoDB 外部テーブル:外部テーブルを使用して ApsaraDB for MongoDB からデータをインポートする。
Tablestore 外部テーブル:Tablestore データのクエリとインポート。
MaxCompute 外部テーブル:外部テーブルを使用して MaxCompute からデータをインポートする。