Object Storage Service (OSS) から AnalyticDB for MySQL にデータをインポートする場合、外部テーブルを使用して、Parquet、CSV、または ORC 形式の OSS オブジェクトを Data Warehouse Edition にインポートできます。
前提条件
AnalyticDB for MySQL Data Warehouse Edition クラスタが作成されていること。
AnalyticDB for MySQL クラスタで ENI (Elastic Network Interface) が有効になっていること。
重要AnalyticDB for MySQL コンソール にログインし、クラスタ詳細ページの左側のナビゲーションウィンドウで を選択し、[ネットワーク情報] セクションで ENI を有効にします。
ENI を有効または無効にすると、データベース接続が約 2 分間中断される場合があります。この間、読み取りまたは書き込み操作を実行することはできません。 ENI を有効または無効にする場合は注意してください。
AnalyticDB for MySQL クラスタと同じリージョンに OSS バケットが作成されていること。詳細については、「OSS をアクティブ化する」をご参照ください。
サンプルデータ
この例では、oss_import_test_data.csv
オブジェクトが OSS の testBucketname/adb/
ディレクトリにアップロードされています。行区切り文字は改行、列区切り文字はセミコロン (;) です。oss_import_test_data.csv
オブジェクトに含まれるデータの一部を以下に示します。
uid;other
12;hello_world_1
27;hello_world_2
28;hello_world_3
33;hello_world_4
37;hello_world_5
40;hello_world_6
手順
AnalyticDB for MySQL クラスタにデータベースを作成します。
CREATE DATABASE adb_demo;
外部テーブルを作成します。CREATE TABLE 文を実行して、CSV、Parquet、または ORC 形式の OSS 外部テーブルを作成できます。詳細については、このトピックの「OSS 外部テーブルを作成するための構文」セクションをご参照ください。
この例では、CSV 形式の oss_import_test_external_table という名前の非パーティション外部テーブルを使用します。
CREATE TABLE IF NOT EXISTS oss_import_test_external_table ( uid string, other string ) ENGINE='OSS' TABLE_PROPERTIES='{ "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com", "url":"oss://testBucketname/adb/oss_import_test_data.csv", "accessid":"LTAI****************", "accesskey":"yourAccessKeySecret", "delimiter":";", "skip_header_line_count":1, "charset":"utf-8" }';
oss_import_test_external_table
外部テーブルのデータをクエリします。説明CSV、Parquet、および ORC オブジェクトに対するクエリでは、データ量が多いほどパフォーマンスの低下が大きくなります。クエリ効率を向上させるには、以下の手順 (4 と 5) を実行して、OSS 外部テーブルのデータをクエリするために AnalyticDB for MySQL にインポートすることをお勧めします。
SELECT uid, other FROM oss_import_test_external_table WHERE uid < 100 LIMIT 10;
OSS 外部テーブルからインポートされたデータを格納するために、AnalyticDB for MySQL クラスタにテーブルを作成します。
CREATE TABLE IF NOT EXISTS adb_oss_import_test ( uid string, other string ) DISTRIBUTED BY HASH(uid);
INSERT 文を実行して、OSS 外部テーブルから AnalyticDB for MySQL にデータをインポートします。
重要デフォルトでは、
INSERT INTO
文とINSERT OVERWRITE SELECT
文はデータを同期的にインポートします。数百ギガバイトのデータをインポートする場合、クライアントは AnalyticDB for MySQL サーバーとの接続を長時間維持する必要があります。このプロセス中、ネットワークの切断によりインポートが失敗する可能性があります。したがって、大量のデータをインポートする場合は、SUBMIT JOB INSERT OVERWRITE SELECT
文を実行してデータを非同期的にインポートすることをお勧めします。方法 1:
INSERT INTO
文を実行してデータをインポートします。プライマリキーに重複する値がある場合、データは繰り返し挿入されず、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*/
) を追加して、ジョブを高速化できます。詳細については、「INSERT OVERWRITE SELECT」トピックの「非同期書き込み」セクションをご参照ください。SUBMIT JOB INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table;
サンプル結果:
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** |
非同期ジョブの送信方法については、「インポートジョブを非同期的に送信する」をご参照ください。
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":"text|orc|parquet",
"delimiter":";",
"skip_header_line_count":1,
"charset":"utf-8"
}';
テーブル形式 | パラメーター | 必須 | 説明 |
CSV、Parquet、または ORC | ENGINE='OSS' | はい | テーブルエンジン。値を OSS に設定します。 |
endpoint | OSS バケットの [エンドポイント]。AnalyticDB for MySQL は、VPC (Virtual Private Cloud) を使用してのみ OSS にアクセスできます。 説明 OSS コンソール にログインし、バケットを見つけ、[概要] ページで [エンドポイント] を取得します。 | ||
url | OSS オブジェクトまたはディレクトリのパス。有効な値:
| ||
accessid | OSS に対する権限を持つ Alibaba Cloud アカウントまたは RAM (Resource Access Management) ユーザーの AccessKey ID。 AccessKey ID の取得方法については、「アカウントと権限」をご参照ください。 | ||
accesskey | OSS に対する権限を持つ Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey シークレット。 AccessKey シークレットの取得方法については、「アカウントと権限」をご参照ください。 | ||
CSV | delimiter | CSV オブジェクトの列区切り文字。 | |
Parquet または ORC | format | OSS オブジェクトの形式。
説明
| |
CSV | null_value | いいえ | CSV オブジェクトの 重要 このパラメーターは、V3.1.4.2 以降の AnalyticDB for MySQL クラスタでのみサポートされています。 |
ossnull | CSV オブジェクトの
説明 上記の例は、 | ||
skip_header_line_count | データをインポートするときにスキップするヘッダー行の数。CSV オブジェクトの最初の行はテーブルヘッダーです。このパラメーターを 1 に設定すると、データをインポートするときにオブジェクトの最初の行がスキップされます。 このパラメーターのデフォルト値は 0 で、行はスキップされません。 | ||
oss_ignore_quote_and_escape | 引用符 (") とエスケープ文字を無視するかどうかを指定します。このパラメーターのデフォルト値は false で、引用符 (") とエスケープ文字は無視されません。 重要 このパラメーターは、V3.1.4.2 以降の AnalyticDB for MySQL クラスタでのみサポートされています。 | ||
charset | OSS 外部テーブルで使用される文字セット。有効な値:
重要 このパラメーターは、V3.1.10.4 以降の AnalyticDB for MySQL クラスタでのみサポートされています。 |
外部テーブルを作成するステートメントで使用される列名は、Parquet または ORC ファイルの列名と同じである必要があります。列名は大文字と小文字を区別しません。ステートメントの列の順序は、Parquet または ORC ファイルの順序と同じである必要があります。
外部テーブルを作成するときに、Parquet または ORC ファイルの特定の列のみを外部テーブルの列として選択できます。Parquet または ORC ファイルで選択されていない列はインポートされません。
外部テーブルを作成するために使用されるステートメントに、Parquet または ORC ファイルにない列が含まれている場合、この列には NULL が返されます。
Parquet、ORC、および AnalyticDB for MySQL 間のデータ型マッピング
Parquet と AnalyticDB for MySQL 間のデータ型マッピング
Parquet の基本型 | Parquet の論理型 | 入力データ型AnalyticDB for MySQL のデータ型 |
BOOLEAN | N/A | BOOLEAN |
INT32 | INT_8 | TINYINT |
INT32 | INT_16 | SMALLINT |
INT32 | N/A | INT または INTEGER |
INT64 | N/A | BIGINT |
FLOAT | N/A | FLOAT |
DOUBLE | N/A | DOUBLE |
| DECIMAL | DECIMAL |
BINARY | UTF-8 |
|
INT32 | DATE | DATE |
INT64 | TIMESTAMP_MILLIS | TIMESTAMP または DATETIME |
INT96 | N/A | TIMESTAMP または DATETIME |
STRUCT
型の列を使用する Parquet 外部テーブルは作成できません。
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 |
LIST
、STRUCT
、または UNION
型を使用する ORC 外部テーブルは作成できません。MAP
型を使用する ORC 外部テーブルは作成できますが、クエリすることはできません。
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":"LTAI****************",
"accesskey":"yourAccessKeySecret",
"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
です。OSS 外部テーブルを使用して Hive の TEXT ファイルのデータを読み書きする場合は、delimiter
パラメーターで \1 を\\1
にエスケープする必要があります。デフォルトでは、Hive の TEXT ファイルの
NULL
値は\N
です。OSS 外部テーブルを使用して Hive の TEXT ファイルのデータを読み書きする場合は、null_value
パラメーターで \N を\\\\N
にエスケープする必要があります。Hive の
BINARY
、CHAR(N)
、およびVARCHAR(N)
型はすべて、VARCHAR
AnalyticDB for MySQL のBOOLEAN
AnalyticDB for MySQL 型に対応します。 などの Hive の他の基本データ型は、 のものと同じです。
パーティション OSS 外部テーブル
パーティションを含む OSS データ用に階層ディレクトリが生成されます。例:
parquet_partition_classic/
├── p1=2020-01-01
│ ├── p2=4
│ │ ├── p3=SHANGHAI
│ │ │ ├── 000000_0
│ └── 000000_1
│ └── p3=SHENZHEN
│ │ └── 000000_0
│ └── p2=6
│ └── p3=SHENZHEN
│ └── 000000_0
├── p1=2020-01-02
│ └── p2=8
│ ├── p3=SHANGHAI
│ │ └── 000000_0
│ └── p3=SHENZHEN
│ └── 000000_0
└── p1=2020-01-03
└── p2=6
├── p2=HANGZHOU
└── p3=SHENZHEN
└── 000000_0
上記の例では、p1 はレベル 1 パーティション、p2 はレベル 2 パーティション、p3 はレベル 3 パーティションを示します。パーティションごとにデータをクエリする場合は、OSS 外部テーブルを作成するために使用するステートメントでパーティションキー列を指定する必要があります。次のステートメントは、OSS 外部テーブルを作成し、外部テーブルでパーティションキー列を指定する方法を示しています。この例では、Parquet オブジェクトを使用します。
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":"parquet",
"partition_column":"p1, p2, p3"
}';
TABLE_PROPERTIES
パラメーターのpartition_column
プロパティは、パーティションキー列 (例では p1、p2、p3) を指定します。partition_column
プロパティで指定されたパーティションキー列は、サンプルデータのパーティションレベルに準拠している必要があります。ステートメントで列を定義するときは、パーティションキー列 (例では p1、p2、p3) とそのデータ型を含める必要があります。パーティションキー列は、列定義の最後に配置する必要があります。
ステートメントで定義されたパーティションキー列は、
partition_column
プロパティで指定されたパーティションキー列と同じ順序である必要があります。パーティションキー列は、次のデータ型をサポートしています。
BOOLEAN
、TINYINT
、SMALLINT
、INT
、INTEGER
、BIGINT
、FLOAT
、DOUBLE
、DECIMAL
、VARCHAR
、STRING
、DATE
、TIMESTAMP
。データをクエリするとき、パーティションキー列は他の列と同じように表示および使用できます。
format パラメーターを空のままにすると、CSV 形式が使用されます。
その他のパラメーターについては、このトピックの「非パーティション OSS 外部テーブル」セクションのパラメーターテーブルをご参照ください。