AnalyticDB for MySQL を使用すると、外部テーブルを介して Tablestore データを直接クエリしたり、内部テーブルにインポートして繰り返し分析したりできます。アドホックアクセスの場合は直接クエリを使用します。パフォーマンスが重視される分析や繰り返し行われる分析の場合は、インポートを使用します。内部テーブルのクエリは、外部テーブルのクエリよりも高速です。
前提条件
開始する前に、以下を確認してください。
AnalyticDB for MySQL の Enterprise Edition、Basic Edition、または Data Lakehouse Edition のクラスターがあること。
ご利用の Tablestore インスタンスが VPC (Virtual Private Cloud) にバインドされている場合、AnalyticDB for MySQL クラスターは同じ VPC 内にある必要があります。
背景情報
Tablestore インスタンスは、Tablestore 内のテーブルとデータを管理するもので、データベースに相当します。各 Tablestore インスタンスは、AnalyticDB for MySQL のスキーマまたはデータベースにマッピングされます。
ネットワークアクセス:VPC が Tablestore インスタンスにバインドされていない場合、AnalyticDB for MySQL はデータに直接アクセスできます。VPC がバインドされている場合、AnalyticDB for MySQL クラスターは同じ VPC 内にある必要があります。
サンプルデータ
このトピックの例では、person という名前の Tablestore テーブルと次のデータを使用します。すでにソースデータがある場合は、このセクションをスキップしてください。
id (プライマリキー) | name | age |
1 | james | 10 |
2 | bond | 20 |
3 | jack | 30 |
4 | lucy | 40 |
SQL エディターの起動
AnalyticDB for MySQL コンソールにログインします。左上の隅でリージョンを選択します。左側のナビゲーションウィンドウで、クラスター をクリックします。対象のクラスターを見つけて、そのクラスター ID をクリックします。
左側のナビゲーションウィンドウで、ジョブ開発 > SQL 開発 を選択します。
Tablestore データのクエリ
ステップ 1:外部データベースの作成
CREATE EXTERNAL DATABASE adb_external_db;ステップ 2:外部テーブルの作成
外部テーブルは、フィールド名、数、順序が Tablestore テーブルと一致している必要があります。また、フィールドのデータ型にも互換性が必要です。データ型のマッピングについては、「データ型マッピング」をご参照ください。
次の例では、adb_external_db データベースに person という名前のテーブルを作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_db.person (
id int,
name string,
age int
)
ENGINE = 'OTS'
TABLE_PROPERTIES = '{
"mapped_name": "person",
"location": "https://w0****la.cn-hangzhou.vpc.tablestore.aliyuncs.com"
}';パラメーター | 説明 |
| Tablestore データの読み書きを行うためのストレージエンジンです。常に |
| Tablestore インスタンス内のテーブル名です。テーブル名を確認するには、Tablestore コンソールに移動し、すべてのインスタンス ページを開きます。 |
| Tablestore インスタンスの VPC URL です。URL を確認するには、Tablestore コンソールに移動し、すべてのインスタンス ページを開きます。 |
ステップ 3:データのクエリ
外部テーブルが作成されると、AnalyticDB for MySQL は Tablestore テーブルからデータを自動的にマッピングします。次の SELECT 文を実行して、データをクエリします。
SELECT * FROM adb_external_db.person;期待される出力:
+------+-------+------+
| id | name | age |
+------+-------+------+
| 1 | james | 10 |
| 2 | bond | 20 |
| 3 | jack | 30 |
| 4 | lucy | 40 |
+------+-------+------+
4 rows in set (0.35 sec)Tablestore データを AnalyticDB for MySQL にインポート
Tablestore から AnalyticDB for MySQL の内部テーブルにデータをインポートすると、繰り返しクエリを高速化できます。3 つの書き込みメソッドが利用可能です。重複排除とパフォーマンスの要件に基づいて選択してください。
ステップ 1:データベースの作成
CREATE DATABASE adb_demo;ステップ 2:宛先テーブルの作成
宛先テーブルは、外部テーブルと同じフィールド数と順序を持つ必要があります。フィールドのデータ型には互換性が必要です。
CREATE TABLE IF NOT EXISTS adb_demo.adb_import_test (
id int,
name string,
age int
)
DISTRIBUTED BY HASH(id);ステップ 3:データの書き込み
重複するプライマリキーをどのように処理するかに基づいて、書き込みメソッドを選択します。
メソッド | 重複の処理 | 構文 |
INSERT INTO | 重複をスキップ (INSERT IGNORE INTO と同等) |
|
INSERT OVERWRITE | 重複を上書き |
|
SUBMIT JOB | 非同期の上書き |
|
メソッド 1:INSERT INTO (重複をスキップ)
重複するプライマリキーを持つ行がすでに存在する場合、その行はスキップされます。
INSERT INTO adb_demo.adb_import_test
SELECT * FROM adb_external_db.person;結果を確認します。
SELECT * FROM adb_demo.adb_import_test;期待される出力:
+------+-------+------+
| id | name | age |
+------+-------+------+
| 1 | james | 10 |
| 2 | bond | 20 |
| 3 | jack | 30 |
| 4 | lucy | 40 |
+------+-------+------+メソッド 2:INSERT OVERWRITE (重複を置き換え)
重複するプライマリキーを持つ行がすでに存在する場合、既存の行は上書きされます。
INSERT OVERWRITE adb_demo.adb_import_test
SELECT * FROM adb_external_db.person;メソッド 3:SUBMIT JOB (非同期インポート)
ほとんどの場合、SUBMIT JOB を使用してインポートを非同期で実行します。/*+ direct_batch_load=true*/ ヒントを追加して、ジョブを高速化できます。
SUBMIT JOB
INSERT OVERWRITE adb_demo.adb_import_test
SELECT * FROM adb_external_db.person;この文はジョブ ID を返します。
+---------------------------------------+
| job_id |
+---------------------------------------+
| 2020112122202917203100908203303****** |非同期ジョブをモニターするには、「非同期でのインポートジョブの送信」をご参照ください。
データ型マッピング
次の表に、Tablestore と AnalyticDB for MySQL 間のデータ型マッピングを示します。
Tablestore | AnalyticDB for MySQL |
INTEGER (8 バイト) | BIGINT (8 バイト) |
STRING | VARCHAR |
BINARY | BINARY |
DOUBLE | DOUBLE |
BOOLEAN | BOOLEAN |
次のステップ
INSERT INTO 文が重複をどのように処理するかについては、「INSERT INTO」をご参照ください。
非同期インポートのオプションと INSERT OVERWRITE SELECT 構文については、「INSERT OVERWRITE SELECT」をご参照ください。