すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:外部テーブルを使用してデータをdata Warehouse Editionにインポートする

最終更新日:Oct 30, 2024

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        

手順

  1. AnalyticDB for MySQLクラスターにデータベースを作成します。

    CREATE DATABASE adb_demo;
  2. 外部テーブルを作成します。 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"
    }'; 
  3. 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;
  4. AnalyticDB for MySQLクラスターにテーブルを作成し、OSS外部テーブルからインポートされたデータを保存します。

    CREATE TABLE IF NOT EXISTS adb_oss_import_test
    (
        uid string,
        other string
    )
    DISTRIBUTED BY HASH(uid);
  5. 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オブジェクトまたはディレクトリのパス。 有効な値:

  • OSSオブジェクトの絶対パス。 例: oss:// testBucketname/adb/oss_import_test_data.csv

  • スラッシュ (/) で終わるOSSディレクトリのパス。 例: oss:// testBucketname/adb/

    説明

    このパラメーターをOSSディレクトリのパスに設定した場合、作成された外部テーブルにはディレクトリ内のすべてのデータが含まれます。

  • アスタリスク (*) ワイルドカードで終わるパス。指定されたパターンを満たすすべてのオブジェクトとディレクトリを照合するために使用されます。 例: oss:// testBucketname/adb/list_file_with_prefix/test *

    説明

    上記のサンプルパスは、oss:// testBucketname/adb/list_file_with_prefix/testfile1

    oss:// testBucketname/adb/list_file_with_prefix/test1/file2

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オブジェクトの形式。

  • Parquet形式で外部テーブルを作成する場合、このパラメーターをparquetに設定する必要があります。

  • ORC形式で外部テーブルを作成する場合、このパラメーターをorcに設定する必要があります。

説明
  • このパラメーターは、OSS外部テーブルをParquet形式またはORC形式で作成する場合にのみ指定する必要があります。

  • formatパラメーターを空のままにすると、CSV形式が使用されます。

CSV

null_value

選択可能

CSVオブジェクトのNULL値。 デフォルトでは、空の文字列はNULLとして定義されます。これは "null_value": "です。

重要

このパラメーターは、V3.1.4.2以降のAnalyticDB for MySQLクラスターでのみサポートされます。

ossnull

CSVオブジェクトのNULL値を定義するためのルール。 有効な値:

  • 1 (デフォルト): EMPTY_SEPARATORS 空の文字列のみがNULLとして定義されます。

    たとえば、a、"" 、、cは、このルールに基づいて "a" 、"" 、NULL、"c" と解釈されます。

  • 2: EMPTY_QUOTES。 引用符 ("") のみがNULLとして定義されます。

    たとえば、a、"" 、、cは、このルールに基づいて "a" 、NULL、"" 、"c" と解釈されます。

  • 3: 両方。 空の文字列と引用符 ("") はどちらもNULLとして定義されます。

    たとえば、a、"" 、、cは、このルールに基づいて "a" 、NULL、NULL、"c" と解釈されます。

  • 4: NEITHER. 空の文字列と引用符 ("") はNULLとして定義されません。

    たとえば、a、"" 、、cは、このルールに基づいて "a" 、"" 、"、" 、"、" c "と解釈されます。

説明

上記の例は、"null_value": "" を前提としています。

skip_header_line_count

データをインポートするときにスキップするヘッダー行の数。 CSVオブジェクトの最初の行はテーブルヘッダーです。 このパラメーターを1に設定すると、データをインポートするときにオブジェクトの最初の行がスキップされます。

このパラメーターのデフォルト値は0で、行をスキップしないことを指定します。

oss_ignore_quote_and_escape

引用符 (") とエスケープ文字を無視するかどうかを指定します。 このパラメーターのデフォルト値はfalseで、引用符 (") とエスケープ文字を無視しないように指定します。

重要

このパラメーターは、V3.1.4.2以降のAnalyticDB for MySQLクラスターでのみサポートされます。

charset

OSS外部テーブルで使用される文字セット。 有効な値:

  • utf-8 (デフォルト)

  • gbk

重要

このパラメーターは、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

  • FIXED_LEN_BYTE_ARRAY

  • BINARY

  • INT64

  • INT32

DECIMAL

DECIMAL

BINARY

UTF-8

  • VARCHAR

  • STRING

  • JSON (ParquetオブジェクトにJSON型の列が含まれている場合に使用できます)

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

  • BINARY

  • STRING

  • VARCHAR

  • VARCHAR

  • STRING

  • JSON (ORCオブジェクトにJSON型の列が含まれている場合に使用可能)

TIMESTAMP

TIMESTAMPまたはDATETIME

日付

日付

重要

LISTSTRUCT、または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のBINARYCHAR(N) 、およびVARCHAR(N) タイプはすべて、AnalyticDB for MySQLVARCHARタイプに対応します。 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プロパティで指定されているパーティションキーの列と同じ順序である必要があります。

  • パーティションキー列は、BOOLEANTINYINTSMALLINTINTINTEGERBIGINTFLOATDOUBLEDECIMALVARCHARSTRINGDATE、およびTIMESTAMPをサポートします。

  • データをクエリすると、パーティションキーの列が表示され、他の列と同じ方法で使用できます。

  • formatパラメーターを空のままにすると、CSV形式が使用されます。

  • その他のパラメーターについては、このトピックの「非パーティション化OSS外部テーブル」セクションのパラメーターテーブルをご参照ください。