Object Storage Service (OSS) からAnalyticDB for MySQLにデータをインポートする場合は、外部テーブルを使用して、Parquet、CSV、またはORC形式のOSSオブジェクトをdata Warehouse Editionにインポートできます。
前提条件
AnalyticDB for MySQL Data Warehouse Editionクラスターが作成されました。
説明AnalyticDB for MySQLクラスターがData Warehouse Edition in elastic modeの場合、クラスター情報 ページの ネットワーク情報 セクションでEniネットワークをオンにする必要があります。
OSSバケットは、AnalyticDB for MySQLクラスターと同じリージョンに作成されます。 詳細については、「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":"LTAIF****5FsE", "accesskey":"Ccw****iWjv", "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;
AnalyticDB for MySQLクラスターにテーブルを作成し、OSS外部テーブルからインポートされたデータを保存します。
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":"txt|orc|parquet",
"delimiter":";",
"skip_header_line_count":1,
"charset":"utf-8"
}';
テーブル形式 | パラメーター | 必須 | 説明 |
CSV, Parquet, or ORC | エンジン='OSS' | 必須 | テーブルエンジン。 値をOSSに設定します。 |
endpoint | OSSバケットのエンドポイント。 AnalyticDB for MySQLは、仮想プライベートクラウド (VPC) を使用してのみ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 or 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間のデータ型マッピング
基本タイプin Parquet | Parquetの論理型 | AnalyticDB for MySQLのデータ型 |
BOOLEAN | 非該当 | BOOLEAN |
INT32 | INT_8 | TINYINT |
INT32 | INT_16 | SMALLINT |
INT32 | 非該当 | INTまたはINTEGER |
INT64 | 非該当 | BIGINT |
FLOAT | 非該当 | FLOAT |
DOUBLE | 非該当 | DOUBLE |
| DECIMAL | DECIMAL |
BINARY | UTF-8 |
|
INT32 | 日付 | 日付 |
INT64 | TIMESTAMP_MILLIS | TIMESTAMPまたはDATETIME |
INT96 | 非該当 | TIMESTAMPまたはDATETIME |
STRUCT
タイプの列を使用するParquet外部テーブルは作成できません。
ORCとAnalyticDB for MySQL間のデータ型マッピング
ORCのデータ型 | AnalyticDB for MySQLのデータ型 |
BOOLEAN | BOOLEAN |
BYTE | TINYINT |
短い | SMALLINT |
INT | INTまたはINTEGER |
LONG | BIGINT |
DECIMAL | DECIMAL |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
|
|
TIMESTAMP | TIMESTAMPまたはDATETIME |
日付 | 日付 |
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":"LTAIF****5FsE",
"accesskey":"Ccw****iWjv",
"url":"oss://testBucketname/adb_data/",
"delimiter": "\\1",
"null_value": "\\\\N",
"oss_ignore_quote_and_escape": "true",
"ossnull": 2
}';
OSS外部テーブルをCSV形式で作成して、HiveでTEXTファイルのデータを読み書きする場合は、次の項目に注意してください。
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)
タイプはすべて、AnalyticDB for MySQLのVARCHAR
タイプに対応します。BOOLEAN
などのHiveのその他の基本データ型は、AnalyticDB for MySQLと同じです。
パーティション化された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外部テーブル」セクションのパラメーターテーブルをご参照ください。