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

AnalyticDB:外部テーブルを使用した HDFS データのインポート

最終更新日:Oct 22, 2025

AnalyticDB for MySQL は、外部テーブルを使用したデータのインポートとエクスポートをサポートしています。 このトピックでは、外部テーブルを使用して Hadoop 分散ファイルシステム (HDFS) からデータをクエリし、そのデータを AnalyticDB for MySQL にインポートする方法について説明します。

前提条件

  • お使いの AnalyticDB for MySQL クラスターは、カーネルバージョン 3.1.4 以降を実行している必要があります。

    説明

    AnalyticDB for MySQL クラスターの マイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。

  • HDFS データファイルは、CSV、Parquet、または ORC 形式である必要があります。

  • HDFS クラスターが作成され、インポートするデータが HDFS フォルダーに準備されていること。 このトピックでは、hdfs_import_test_data.csv フォルダーを例として使用します。

  • 次のサービスアクセスポートが、AnalyticDB for MySQL クラスター用に HDFS クラスターで設定されていること:

    • namenode: ファイルシステムメタデータの読み書きを行います。 ポート番号は fs.defaultFS パラメーターで設定できます。 デフォルトのポートは 8020 です。

      設定の詳細については、「core-default.xml」をご参照ください。

    • datanode: データの読み書きを行います。 ポート番号は dfs.datanode.address パラメーターで設定できます。 デフォルトのポートは 50010 です。

      設定の詳細については、「hdfs-default.xml」をご参照ください。

  • AnalyticDB for MySQL Data Warehouse Edition (弾性モード) は、Elastic Network Interface (ENI) アクセスをサポートしています。

    重要
    • AnalyticDB for MySQL コンソールにログインします。 [クラスター情報] ページで、[ネットワーク情報] セクションで、Elastic Network Interface (ENI) スイッチをオンにします。

    • ENI ネットワークを有効または無効にすると、データベース接続が約 2 分間中断されます。 この間、読み取りおよび書き込み操作は利用できません。 ENI ネットワークを有効または無効にする前に、影響を評価してください。

手順

  1. ターゲットデータベースを作成します。 この例では、AnalyticDB for MySQL クラスターのターゲットデータベースの名前は adb_demo です。

    CREATE DATABASE IF NOT EXISTS adb_demo;    
  2. adb_demo ターゲットデータベースで、CREATE TABLE 文を使用して、CSV、Parquet、または ORC 形式の外部テーブルを作成します。

  3. ターゲットテーブルを作成します。

    次のいずれかの文を使用して、adb_demo ターゲットデータベースにターゲットテーブルを作成し、HDFS からインポートされたデータを格納します。

    • 標準の外部テーブル用のターゲットテーブルを作成します。 この例では、ターゲットテーブルの名前は adb_hdfs_import_test です。 構文は次のとおりです。

      CREATE TABLE IF NOT EXISTS adb_hdfs_import_test
      (
          uid string,
          other string
      )
      DISTRIBUTED BY HASH(uid);
    • パーティション化された外部テーブルのターゲットテーブルを作成する場合、uidother などの標準列と、p1p2p3 などのパーティションキー列の両方を定義する必要があります。 この例では、ターゲットテーブルの名前は adb_hdfs_import_parquet_partition です。 構文は次のとおりです。

      CREATE TABLE IF NOT EXISTS adb_hdfs_import_parquet_partition
      (
          uid string,
          other string,
          p1 date,
          p2 int,
          p3 varchar
      )
      DISTRIBUTED BY HASH(uid);
  4. HDFS からターゲットの AnalyticDB for MySQL クラスターにデータをインポートします。

    必要に応じてデータをインポートする方法を選択します。 パーティションテーブルにデータをインポートする構文は、標準テーブルの場合と同じです。 次の例では、標準テーブルを使用します。

    • 方法 1 (推奨): INSERT OVERWRITE を使用してデータをインポートします。 この方法はバッチインポートをサポートし、高いパフォーマンスを提供します。 データはインポートが成功した後に表示されます。 インポートが失敗した場合、データはロールバックされます。 次のコードは例です。

      INSERT OVERWRITE adb_hdfs_import_test
      SELECT * FROM hdfs_import_test_external_table;
    • 方法 2: INSERT INTO を使用してデータをインポートします。 挿入されたデータはリアルタイムクエリで利用できます。 この方法は、少量のデータに使用します。 次のコードは例です。

      INSERT INTO adb_hdfs_import_test
      SELECT * FROM hdfs_import_test_external_table;
    • 方法 3: 非同期タスクを実行してデータをインポートします。 次のコードは例です。

      SUBMIT JOB INSERT OVERWRITE adb_hdfs_import_test
      SELECT * FROM hdfs_import_test_external_table;

      次の結果が返されます。

      +---------------------------------------+
      | job_id                                |
      +---------------------------------------+
      | 2020112122202917203100908203303****** |
      +---------------------------------------+

      job_id に基づいて非同期タスクのステータスを確認することもできます。 詳細については、「非同期でのインポートタスクの送信」をご参照ください。

次のステップ

インポートが完了したら、AnalyticDB for MySQL クラスターの adb_demo ターゲットデータベースにログインします。 次の文を実行して、データがソーステーブルから adb_hdfs_import_test ターゲットテーブルにインポートされたことを確認します。

SELECT * FROM adb_hdfs_import_test LIMIT 100;

HDFS 外部テーブルの作成

  • CSV ファイル用の外部テーブルの作成

    構文は次のとおりです。

    CREATE TABLE IF NOT EXISTS hdfs_import_test_external_table
    (
        uid string,
        other string
    )
    ENGINE='HDFS'
    TABLE_PROPERTIES='{
        "format":"csv",
        "delimiter":",",
        "hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_import_test_csv_data/hdfs_import_test_data.csv"
    }';

    パラメーター

    必須

    説明

    ENGINE='HDFS'

    必須

    外部テーブルのストレージエンジン。 この例では HDFS を使用します。

    TABLE_PROPERTIES

    AnalyticDB for MySQL が HDFS データにアクセスする方法。

    format

    データファイルの形式。 CSV ファイルの外部テーブルを作成するには、このパラメーターを csv に設定します。

    delimiter

    CSV データファイルの列区切り文字。 この例ではコンマ (,) を使用します。

    hdfs_url

    HDFS クラスター内のターゲットデータファイルまたはフォルダーの絶対アドレス。 アドレスは hdfs:// で始まる必要があります。

    例: hdfs://172.17.***.***:9000/adb/hdfs_import_test_csv_data/hdfs_import_test_data.csv

    partition_column

    オプション

    外部テーブルのパーティションキー列。 複数の列はコンマ (,) で区切ります。 パーティションキー列の定義方法については、「パーティション化された HDFS 外部テーブルの作成」をご参照ください。

    compress_type

    データファイルの圧縮タイプ。 CSV ファイルは Gzip 圧縮タイプのみをサポートします。

    skip_header_line_count

    データインポート中にファイルの先頭でスキップするヘッダー行の数。 CSV ファイルの最初の行はテーブルヘッダーです。 このパラメーターを 1 に設定すると、データインポート中に最初の行が自動的にスキップされます。

    デフォルト値は 0 で、行はスキップされません。

    hdfs_ha_host_port

    HDFS クラスターに高可用性 (HA) 機能が設定されている場合は、外部テーブルを作成するときに hdfs_ha_host_port パラメーターを設定します。 形式は ip1:port1,ip2:port2 です。 IP アドレスとポートは、プライマリおよびセカンダリの namenode インスタンス用です。

    例: 192.168.xx.xx:8020,192.168.xx.xx:8021

  • Parquet または ORC ファイル用の外部テーブルの作成

    次の文は、Parquet ファイル用の外部テーブルを作成する方法を示しています。

    CREATE TABLE IF NOT EXISTS hdfs_import_test_external_table
    (
        uid string,
        other string
    )
    ENGINE='HDFS'
    TABLE_PROPERTIES='{
        "format":"parquet",
        "hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_import_test_parquet_data/"
    }';

    パラメーター

    必須

    説明

    ENGINE='HDFS'

    必須

    外部テーブルのストレージエンジン。 この例では HDFS を使用します。

    TABLE_PROPERTIES

    AnalyticDB for MySQL が HDFS データにアクセスする方法。

    format

    データファイルの形式。

    • Parquet ファイルの外部テーブルを作成するには、このパラメーターを parquet に設定します。

    • ORC ファイルの外部テーブルを作成するには、このパラメーターを orc に設定します。

    hdfs_url

    HDFS クラスター内のターゲットデータファイルまたはフォルダーの絶対アドレス。 アドレスは hdfs:// で始まる必要があります。

    partition_column

    オプション

    テーブルのパーティションキー列。 複数の列はコンマ (,) で区切ります。 パーティションキー列の定義方法については、「パーティション化された HDFS 外部テーブルの作成」をご参照ください。

    hdfs_ha_host_port

    HA 機能が HDFS クラスターに設定されている場合は、外部テーブルを作成するときに hdfs_ha_host_port パラメーターを設定します。 形式は ip1:port1,ip2:port2 です。 IP アドレスとポートは、プライマリおよびセカンダリの namenode インスタンス用です。

    例: 192.168.xx.xx:8020,192.168.xx.xx:8021

    説明
    • 外部テーブルの `CREATE TABLE` 文の列名は、Parquet または ORC ファイルの列名と同一である必要がありますが、大文字と小文字は区別されません。 列の順序も同じである必要があります。

    • 外部テーブルを作成するときに、Parquet または ORC ファイルから一部の列のみを選択して外部テーブルの列にすることができます。 選択されていない列はインポートされません。

    • 外部テーブルの `CREATE TABLE` 文に Parquet または ORC ファイルに存在しない列が含まれている場合、その列のクエリは NULL を返します。

    Parquet ファイルと AnalyticDB for MySQL 間のデータ型マッピング

    Parquet 基本データ型

    Parquet logicalType

    AnalyticDB for MySQL のデータ型

    BOOLEAN

    None

    BOOLEAN

    INT32

    INT_8

    TINYINT

    INT32

    INT_16

    SMALLINT

    INT32

    None

    INT または INTEGER

    INT64

    None

    BIGINT

    FLOAT

    None

    FLOAT

    DOUBLE

    None

    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

    None

    TIMESTAMP または DATETIME

    重要

    Parquet ファイルの外部テーブルは STRUCT 型をサポートしていません。 この型を使用すると、テーブルの作成は失敗します。

    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

    重要

    ORC ファイルの外部テーブルは、LISTSTRUCTUNION などの複雑な型をサポートしていません。 これらの型を使用すると、テーブルの作成は失敗します。 列が MAP 型を使用している場合、ORC ファイルの外部テーブルを作成できますが、そのテーブルに対するクエリは失敗します。

パーティション化された HDFS 外部テーブルの作成

HDFS は、Parquet、CSV、および ORC ファイル形式でのデータのパーティション分割をサポートしています。 パーティション化されたデータは、HDFS 上に階層的なディレクトリを形成します。 次の例では、p1 はレベル 1 のパーティション、p2 はレベル 2 のパーティション、p3 はレベル 3 のパーティションです。

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

次の文は、Parquet ファイルに対して指定された列を持つ外部テーブルを作成する方法を示しています。

CREATE TABLE IF NOT EXISTS hdfs_parquet_partition_table
(
  uid varchar,
  other varchar,
  p1 date,
  p2 int,
  p3 varchar
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
  "hdfs_url":"hdfs://172.17.***.**:9000/adb/parquet_partition_classic/",
  "format":"parquet",  // CSV または ORC ファイルの外部テーブルを作成するには、format の値を csv または orc に変更します。
  "partition_column":"p1, p2, p3"  // パーティション化された HDFS データの場合、パーティションごとにデータをクエリするには、AnalyticDB for MySQL にデータをインポートするときに、CREATE EXTERNAL TABLE 文で partition_column パラメーターを指定する必要があります。
}';
説明
  • TABLE_PROPERTIESpartition_column パラメーターは、p1、p2、p3 などのパーティションキー列を指定します。 パーティションキー列は、レベル 1 からレベル 3 のパーティションの順に partition_column パラメーターで宣言する必要があります。

  • 列定義には、p1、p2、p3 などのパーティションキー列とそのデータ型を含める必要があります。 パーティションキー列は、列定義の最後に配置する必要があります。

  • 列定義内のパーティションキー列の順序は、partition_column パラメーター内の順序と一致する必要があります。

  • パーティションキー列は、次のデータ型をサポートしています: BOOLEANTINYINTSMALLINTINTINTEGERBIGINTFLOATDOUBLEDECIMALVARCHARSTRINGDATE、および TIMESTAMP

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

  • 形式を指定しない場合、デフォルトの形式は CSV です。

  • 他のパラメーターの詳細については、「パラメーターの説明」をご参照ください。