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

AnalyticDB:Data Warehouse Edition にデータをインポートするための外部テーブルの使用

最終更新日:Apr 15, 2025

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        

手順

  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":"LTAI****************",
        "accesskey":"yourAccessKeySecret",
        "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. OSS 外部テーブルからインポートされたデータを格納するために、AnalyticDB for MySQL クラスタにテーブルを作成します。

    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":"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 オブジェクトまたはディレクトリのパス。有効な値:

  • 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 または ORC

format

OSS オブジェクトの形式。

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

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

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

  • 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" と解釈されます。

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

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

  • 3BOTH。空の文字列と引用符 ("") の両方が NULL として定義されます。

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

  • 4NEITHER。空の文字列と引用符 ("") は 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 間のデータ型マッピング

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

  • FIXED_LEN_BYTE_ARRAY

  • BINARY

  • INT64

  • INT32

DECIMAL

DECIMAL

BINARY

UTF-8

  • VARCHAR

  • STRING

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

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

  • BINARY

  • STRING

  • VARCHAR

  • VARCHAR

  • STRING

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

TIMESTAMP

TIMESTAMP または DATETIME

DATE

DATE

重要

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":"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 の BINARYCHAR(N)、および VARCHAR(N) 型はすべて、VARCHARAnalyticDB for MySQLBOOLEANAnalyticDB 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 プロパティで指定されたパーティションキー列と同じ順序である必要があります。

  • パーティションキー列は、次のデータ型をサポートしています。BOOLEANTINYINTSMALLINTINTINTEGERBIGINTFLOATDOUBLEDECIMALVARCHARSTRINGDATETIMESTAMP

  • データをクエリするとき、パーティションキー列は他の列と同じように表示および使用できます。

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

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