このトピックでは、パブリックネットワークまたは VPC 経由で ApsaraDB for MySQL 外部テーブルを作成し、データを書き込む方法について説明します。
はじめに
ApsaraDB for RDS (Relational Database Service) は、Alibaba Cloud が提供するマネージド型リレーショナルデータベースサービスです。通常、ApsaraDB for RDS インスタンスには内部エンドポイントを使用してアクセスします。MaxCompute を使用すると、ApsaraDB for MySQL インスタンス内のテーブルからデータを読み取ったり、データを書き込んだりできます。
制限事項
-
リージョンの制限:次のリージョンがサポートされています:中国 (北京)、中国 (上海)、中国 (張家口)、中国 (ウランチャブ)、中国 (杭州)、中国 (深セン)、中国 (香港)、中国 (上海) 金融クラウド (ゾーン F)、日本 (東京)、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、ドイツ (フランクフルト)、米国 (シリコンバレー)、および米国 (バージニア)。
-
エンジンの制限:ApsaraDB for MySQL バージョン 5.x および 8.0 のみがサポートされます。その他の ApsaraDB for RDS エンジンはサポートされません。
-
PrivateZone ドメイン名はサポートされません。
-
ApsaraDB for MySQL 外部テーブルは、クラスター プロパティをサポートしません。
-
ApsaraDB for MySQL 外部テーブルに大量のデータを書き込む場合、MaxCompute は並列マルチプロセス書き込み方式を使用します。まれに、書き込みプロセスによってデータが再書き込みされ、重複が発生することがあります。
-
スケールの制限:MaxCompute 内の RDS 外部テーブルにおいて、
DECIMALデータの型のデフォルトスケールは 18 であり、変更できません。このデータの型はDECIMAL(38,18)として作成されます。小数点以下の桁数を減らす必要がある場合は、外部テーブル作成時にデータの型をStringとして定義してください。その後、データ使用時にCAST関数を使用して型変換を行います。
スキーマ不一致に関する注意事項
ApsaraDB for MySQL ソーステーブルのスキーマが外部テーブルのスキーマと一致しない場合:
-
カラム数の不一致:ApsaraDB for MySQL ソーステーブルのカラム数が外部テーブルの DDL で指定されたカラム数より少ない場合、データ読み取り時にシステムがエラーを報告します。例:
Unknown column 'xxx' in 'field list'。ApsaraDB for MySQL ソーステーブルのカラム数が外部テーブルの DDL で指定されたカラム数より多い場合、余分なカラムのデータは破棄されます。 -
カラムの型の不一致:ソーステーブルの STRING データを INT 型として読み取ることはできません。INT データを STRING 型として読み取ることは可能ですが、推奨されません。
外部テーブルの作成
構文
テーブル名およびカラム名は大文字と小文字を区別しません。大文字・小文字の強制変換はサポートされていません。
-- Hive 互換モードを有効化します。
SET odps.sql.hive.compatible = true;
CREATE EXTERNAL TABLE <table_name>(
<col_name1> <data_type>,
<col_name2> <data_type>,
......
)
STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' -- JDBC 接続データソース用ハンドラ。
location '<jdbc:mysql://<realm_name:port>/<rds_database_name>?useSSL=false&user=<user_name>&password=<password_value>&table=<rds_table_name>>'
TBLPROPERTIES(
['odps.federation.jdbc.colmapping'='<col_name1:rdstable_colname1|select_alias1>,[<col_name2:rdstable_colname2|select_alias2>,...]',]
'mcfed.mapreduce.jdbc.input.query'='<select_sentence>',
'networklink'='<networklink_name>');
パラメーター
-
table_name:必須。外部テーブルの名前です。
-
col_name:必須。外部テーブルのカラム名です。
-
data_type:必須。カラムのデータの型です。
-
jdbc:mysql://realm_name:port/rds_database_name?useSSL=false&user=user_name&password=password_value&table=rds_table_name:必須。ApsaraDB for MySQL ソーステーブルの接続文字列です。
接続文字列に特殊文字が含まれる場合は、URL エンコードする必要があります。詳細については、「URL_ENCODE」をご参照ください。
-
realm_name:port:ApsaraDB for RDS インスタンスの内部エンドポイントおよびポートです。
-
RDS コンソールにログインします。
-
左側のナビゲーションウィンドウで、[Instances] をクリックします。次に、左上隅でリージョンを選択します。
-
[Instances] ページで、対象インスタンスの [Instance ID/Name] をクリックして、詳細ページを開きます。
-
左側のナビゲーションウィンドウで、[Database Connection] をクリックします。
-
データベースの [Internal Endpoint]、[Public Endpoint]、および [Internal Port] を確認できます。
-
-
rds_database_name:ApsaraDB for MySQL データベースの名前です。
-
user_name:ApsaraDB for MySQL データベースアカウントのユーザー名です。
-
password_value:ApsaraDB for MySQL データベースアカウントのパスワードです。
-
rds_table_name:ApsaraDB for MySQL ソーステーブルの名前です。
-
-
TBLPROPERTIES:
-
odps.federation.jdbc.colmapping:任意です。
MaxCompute 外部テーブルのカラムと ApsaraDB for MySQL ソーステーブルのカラム間のマッピングです。マッピングされるカラム数は、MaxCompute 外部テーブルで定義されたカラム数と一致している必要があります。
マッピングにおいて、rdstable_colname は ApsaraDB for MySQL ソーステーブルのカラム名(すべてのカラムをマッピングするために使用)であり、select_alias はクエリ結果のカラムエイリアス(特定のカラムをマッピングするために使用)です。
-
このパラメーターを設定しない場合、MaxCompute は名前でカラムをマッピングします。
-
一部のカラムのみをマッピングする場合、MaxCompute は指定通りにそれらをマッピングし、残りのカラムを名前でマッピングしようと試みます。自動的にマッピングされたカラムで名前または型の不一致が見つかった場合、エラーが発生します。
-
-
mcfed.mapreduce.jdbc.input.query:任意です。
ApsaraDB for MySQL ソーステーブルからデータを読み取るためのクエリを指定します。外部テーブルのスキーマ(カラム数、名前、データの型)は、エイリアスを含むクエリ結果のスキーマと完全に一致している必要があります。
select_sentenceの形式はSELECT xxx FROM <rds_database_name>.<rds_table_name>です。 -
networklink:必須。ApsaraDB for RDS インスタンスが存在する VPC 用の MaxCompute ネットワーク接続の名前です。
-
MaxCompute コンソールにログインし、左上隅でリージョンを選択します。
-
左側のナビゲーションウィンドウで、 を選択します。
-
ネットワーク接続 ページで、ご利用の ApsaraDB for RDS インスタンスが存在する VPC 用のネットワーク接続の名前を確認します。
RDS コンソールにログインし、インスタンスを選択した後、左側のナビゲーションバーで [Database Connection] をクリックすると、データベースが配置されている VPC を確認できます。
-
-
操作手順
ApsaraDB for MySQL データソースにマッピングされた MaxCompute 外部テーブルを作成し、データをロードするには、次の手順に従ってください。
-
MaxCompute と ApsaraDB for RDS 間にネットワーク接続が確立されていることを確認します。詳細については、「パブリックネットワークへのアクセスソリューション」をご参照ください。
ネットワーク接続が確立されると、MaxCompute は指定された VPC ID のネットワークにのみ接続できます。他のリージョンまたは同一リージョン内の他の VPC にアクセスするには、既存の VPC 接続性ソリューションに基づいて、接続済みの VPC と対象 VPC 間の接続性を確立する必要があります。
-
ApsaraDB for MySQL データベースにログインし、テーブルを作成してデータを挿入します。 詳細については、「Data Management Service (DMS) を使用した ApsaraDB for MySQL インスタンスへのログイン」をご参照ください。
-
RDS コンソールにログインします。
-
左側のナビゲーションウィンドウで、[Instances] をクリックします。次に、左上隅でリージョンを選択します。
-
インスタンスがまだない場合は、[Instances] ページで [Create Instance] をクリックします。すでにインスタンスがある場合は、対象インスタンスの [Instance ID/Name] をクリックして詳細ページを開きます。
インスタンス作成時に、RDS エンジンを ApsaraDB for MySQL 5.x または 8.0 に設定してください。その他の ApsaraDB for RDS エンジンはサポートされません。
-
左側のナビゲーションウィンドウで、[Databases] をクリックします。
-
[Create Database] をクリックします。次のパラメーターを設定します。
パラメーター
必須
説明
例
データベース名
はい
-
名前は 2~64 文字である必要があります。
-
名前の先頭は英字、末尾は英字または数字である必要があります。
-
小文字、数字、アンダースコア (_)、ハイフン (-) を使用できます。
-
インスタンス内でデータベース名は一意である必要があります。
-
データベース名に
-が含まれる場合、作成されたデータベースフォルダの名前に含まれる-は@002dに変更されます。
rds_mc_testサポートされる文字セット
はい
ビジネス要件に基づいて文字セットを選択します。
utf8権限付与アカウント
任意
-
データベースへのアクセスが許可されたアカウントを選択します。このパラメーターを空のままにしておき、データベース作成後にアカウントをアタッチすることも可能です。
-
標準アカウントのみが表示されます。特権アカウントはすべてのデータベースへのアクセス権限を持っているため、権限付与は不要です。
Default説明
任意
管理を容易にするための、最大 256 文字のオプションのデータベース説明です。
ApsaraDB for MySQL 外部テーブル用テストデータベース -
-
[Log On to Database] をクリックします。左側のナビゲーションウィンドウで、[Database Instances] を選択します。作成したデータベースをダブルクリックします。[SQLConsole] ページで、次のステートメントを実行してテストテーブルを作成し、テストデータを書き込みます。
インスタンスが存在するにもかかわらず、インスタンスを展開しても対象データベースが表示されない理由は、次のいずれかの可能性があります。
-
ログインアカウントが対象データベースへのアクセス権限を持っていない:[Accounts] ページに移動して、アカウント権限を変更するか、ログインデータベースアカウントを変更してください。
-
メタデータが同期されておらず、ディレクトリが表示されない:対象データベースを含むインスタンスにマウスポインターを合わせ、インスタンス名の右側にある
ボタンをクリックしてデータベースリストをリフレッシュします。
-
-
ステートメントの例:
CREATE TABLE `rds_mc_external` ( `id` int(11) DEFAULT NULL, `name` varchar(32) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `rds_mc_external`(`id` ,`name` ) VALUES(1,"Alice"); INSERT INTO `rds_mc_external`(`id` ,`name` ) VALUES(1,"Bob");
-
-
ApsaraDB for MySQL データソースにマッピングされた外部テーブルを MaxCompute クライアントで作成します
すべてのカラムをマッピング
-
MaxCompute クライアントで、ApsaraDB for MySQL テーブルのカラム名と一致するカラム名を持つ外部テーブルを作成します。例:
SET odps.sql.hive.compatible = true; CREATE EXTERNAL TABLE mc_vpc_rds_external ( id INT, name STRING) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:mysql://rm-2ze01y92y1tzp****.mysql.rds.aliyuncs.com:3306/rds_mc_test?useSSL=false&user=<your_username>&password=<your_password>&table=rds_mc_external' TBLPROPERTIES( 'odps.federation.jdbc.colmapping'='key:id,value:name', 'mcfed.mapreduce.jdbc.input.query'='select * from rds_mc_test.rds_mc_external', 'networklink'='<your_network_connection_name>'); -
新しい MaxCompute テーブルにデータを挿入します。
INSERT INTO TABLE mc_vpc_rds_external VALUES(2,"Zoey"); -
結果をクエリします。
-- データ挿入結果をクエリします。 SELECT * FROM mc_vpc_rds_external; -- 次の結果が返されます: +------------+------------+ | id | name | +------------+------------+ | 1 | Alice | | 1 | Bob | | 2 | Zoey | +------------+------------+
特定のカラムをマッピング
-
MaxCompute クライアントで外部テーブルを作成し、そのカラムを ApsaraDB for MySQL テーブルの特定のカラムにマッピングします。例:
SET odps.sql.hive.compatible = true; CREATE EXTERNAL TABLE mc_vpc_rds_external_mapping ( id INT, name STRING ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:mysql://rm-2ze01y92y1tzp****.mysql.rds.aliyuncs.com:3306/rds_mc_test?useSSL=false&user=<your_username>&password=<your_password>&table=rds_mc_external' TBLPROPERTIES( 'mcfed.mapreduce.jdbc.input.query'='select * from rds_mc_test.rds_mc_external', 'networklink'='<your_network_connection_name>'); -
新しい MaxCompute テーブルにデータを挿入します。
INSERT INTO TABLE mc_vpc_rds_external_mapping VALUES(4,"Lisa"); -
データ挿入結果をクエリします。
SELECT * FROM mc_vpc_rds_external_mapping; -- 次の結果が返されます: +------------+------------+ | id | name | +------------+------------+ | 1 | Alice | | 1 | Bob | | 4 | Lisa | +------------+------------+
-
TBLPROPERTIES 属性
ApsaraDB for MySQL 外部テーブルの TBLPROPERTIES 句では、次の属性を使用できます。
|
属性 |
機能 |
|
|
ApsaraDB for RDS インスタンスからデータを取得する際に追加されるフィルター条件です。
たとえば、ApsaraDB for MySQL 外部テーブルに 100 行のデータが含まれていると仮定します。 |
|
|
MySQL へのデータ書き込み操作のタイプです。SimpleInsert、InsertOnDuplicateKeyUpdate、ReplaceInto のみがサポートされます。MaxCompute INSERT ステートメントは、データベースを更新するために次の 3 種類の SQL ステートメントに解析されます。
この属性が設定されていない場合、デフォルト値は SimpleInsert です。 |
|
|
読み取りまたは書き込み操作後にトランザクションを自動コミットするかどうかを指定します。 |
|
|
データ書き込み時の各挿入のバッチサイズを指定します。デフォルト値は 1000 です。 |
|
|
この属性を使用すると、外部テーブルからデータを読み取る際に ApsaraDB for RDS ビルトイン関数を呼び出すことができます。たとえば、ApsaraDB for MySQL ソーステーブルに GEOMETRY 型の col_geometry というカラムがあり、MaxCompute 外部テーブルに STRING 型の odps_geo というカラムを指定している場合、この属性を odps_geo:astext(col_geometry) に設定すると、ApsaraDB for MySQL の GEOMETRY データが STRING 型に変換されて MaxCompute に読み込まれます。 |
|
|
この属性を使用すると、外部テーブルにデータを書き込む際に ApsaraDB for RDS ビルトイン関数を呼び出すことができます。たとえば、ApsaraDB for MySQL ソーステーブルに GEOMETRY 型の col_geometry というカラムがあり、MaxCompute 外部テーブルに STRING 型の odps_geo というカラムを指定している場合、この属性を odps_geo:GEOMETRYFROMTEXT(?) に設定すると、MaxCompute の STRING データが ApsaraDB for MySQL で GEOMETRY 型に変換され、ApsaraDB for MySQL テーブルに書き込まれます。 |