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

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

最終更新日:Oct 24, 2024

AnalyticDB for MySQL Data Lakehouse Editionでは、外部テーブルを使用してデータにアクセスし、インポートできます。 通常のインポートまたはエラスティックインポート方法を使用してデータをインポートできます。 通常のインポート方法と比較して、エラスティックインポート方法は、消費するリソースが少なく、リアルタイムのデータの読み取りと書き込みへの影響を軽減します。 このトピックでは、外部テーブルを使用してObject Storage Service (OSS) データを照会し、OSSからAnalyticDB for MySQLにデータをインポートする方法について説明します。

前提条件

  • AnalyticDB for MySQL Data Lakehouse Editionクラスターが作成されます。

  • OSSバケットは、AnalyticDB for MySQLクラスターと同じリージョンに作成されます。

  • データがOSSディレクトリにアップロードされます。 詳細については、「オブジェクトのアップロード」をご参照ください。

サンプルデータ

この例では、personオブジェクトはOSSのtestBucketName/adb/dt=2023-06-15ディレクトリにアップロードされます。 改行は行区切り文字として使用され、コンマ (,) は列区切り文字として使用されます。 personオブジェクトのサンプルデータ:

1,james,10,2023-06-15
2,bond,20,2023-06-15
3,jack,30,2023-06-15
4,lucy,40,2023-06-15       

手順

  1. SQLエディターに移動します。

    1. AnalyticDB for MySQL コンソールにログインします。 ホームページの左上でリージョンを選択します。 左側のナビゲーションウィンドウで、クラスターリスト をクリックします。   [Data Lakehouse Edition] タブで、管理するクラスターを見つけ、クラスターIDをクリックします。

    2. 左側のナビゲーションウィンドウで、ジョブ开発 > Sql開発.

  2. データをインポートする。

    通常のインポートまたはエラスティックインポート方法を使用してデータをインポートできます。 デフォルトでは、通常のインポート方法が使用されます。 通常のインポート方法を使用する場合、データは計算ノードから読み取られ、インデックスはストレージノードに作成されます。 通常のインポート方法は、コンピューティングリソースとストレージリソースを消費します。 elastic importメソッドを使用すると、Serverless Sparkジョブのデータが読み取られ、インデックスが作成されます。 エラスティックインポート方式は、ジョブリソースグループのリソースを消費します。 ジョブリソースグループを持つAnalyticDB for MySQL Data Lakehouse EditionのV3.1.10.0以降のクラスターのみが、elastic importメソッドをサポートしています。 詳細については、「データインポート方法」をご参照ください。

    定期的なインポート

    1. 外部データベースを作成します。

      CREATE EXTERNAL DATABASE adb_external_db;
    2. CREATE EXTERNAL TABLEステートメントを使用して、adb_external_dbデータベースにOSS外部テーブルを作成します。 この例では、外部テーブルの名前はadb_external_db.personです。

      説明

      AnalyticDB for MySQLのOSS外部テーブルは、OSSオブジェクトと同じフィールドの名前、番号、順序、およびデータ型を使用する必要があります。

      パーティション化されていないOSS外部テーブルの作成

      CREATE EXTERNAL TABLE adb_external_db.person
      (
       id INT,
       name VARCHAR(1023),
       age INT,
       dt VARCHAR(1023)
      )
      ROW FORMAT DELIMITED FIELDS TERMINATED BY  ','
      STORED AS TEXTFILE
      LOCATION  'oss://testBucketName/adb/dt=2023-06-15/';

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

      パーティション化されたOSS外部テーブルを作成し、テーブルにパーティションを追加します。

      1. パーティション化されたOSS外部テーブルを作成します。

        CREATE EXTERNAL TABLE adb_external_db.person
        (
         id INT,
         name VARCHAR(1023) ,
         age INT
        )
        PARTITIONED BY (dt STRING)
        ROW FORMAT DELIMITED FIELDS TERMINATED BY  ','
        STORED AS TEXTFILE
        LOCATION  'oss://testBucketName/adb/';
      2. OSS外部テーブルにパーティションを追加します。 ALTER TABLE ADD PARTITIONステートメントを使用してパーティションを手動で追加したり、MSCK REPAIR TABLEステートメントを使用してパーティションを自動的に識別して追加したりできます。

        ALTER TABLE adb_external_db.person ADD PARTITION (dt='2023-06-15') LOCATION 'oss://testBucketName/adb/dt=2023-06-15/';
        説明
        • OSS外部テーブルにパーティションを追加または削除する方法については、「ALTER table (外部テーブル) 」をご参照ください。

        • OSS外部テーブルのパーティションを同期する方法については、「MSCK REPAIR table」をご参照ください。

      構文の詳細については、「CREATE EXTERNAL TABLE」をご参照ください。

    3. データの照会

      外部テーブルを作成した後、AnalyticDB for MySQLでSELECTステートメントを実行して、外部テーブルのデータをクエリできます。

      SELECT * FROM adb_external_db.person;

      サンプル結果:

      +------+-------+------+-----------+
      | id   | name  | age  | dt        |
      +------+-------+------+-----------+
      |    1 | james |   10 |2023-06-15 |
      |    2 | bond  |   20 |2023-06-15 |
      |    3 | jack  |   30 |2023-06-15 |
      |    4 | lucy  |   40 |2023-06-15 |
      +------+-------+------+-----------+
      4 rows in set (0.35 sec)
    4. AnalyticDB for MySQLクラスターにデータベースとテーブルを作成します。 詳細については、「CREATE DATABASE」および「AnalyticDB for MySQL」をご参照ください。 すでにデータベースを作成している場合は、この手順をスキップしてください。

      CREATE DATABASE adb_demo; 
    5. AnalyticDB for MySQLクラスターにテーブルを作成し、OSSからインポートされたデータを保存します。

      説明

      作成した内部テーブルは、手順bで作成した外部テーブルと同じフィールド名、番号、順序、およびデータ型を使用する必要があります。

      adb_demo.adb_import_testが存在しない場合は

      CREATE TABLE IF NOT EXISTS adb_demo.adb_import_test(
          id INT,
          name VARCHAR(1023),
          age INT,
          dt VARCHAR(1023)
      )
      DISTRIBUTE BY HASH(id);
    6. テーブルにデータをインポートします。

      • 方法1: INSERT INTOステートメントを実行してデータをインポートします。 主キーの値が重複している場合、データは繰り返し挿入されず、INSERT INTOステートメントはINSERT IGNORE INTOと同等です。 詳細については、「INSERT INTO」をご参照ください。

        INSERT INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
      • 方法2: INSERT OVERWRITE INTOステートメントを実行して、データを同期的にインポートします。 主キーの値が重複している場合、元の値は新しい値で上書きされます。

        INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
      • 方法3: INSERT OVERWRITE INTOステートメントを実行して、データを非同期的にインポートします。 詳細については、「INSERT OVERWRITE SELECT」トピックの「非同期書き込み」セクションをご参照ください。

        SUBMIT JOB INSERT OVERWRITE adb_demo.adb_import_test SELECT * FROM adb_external_db.person;

    Elastic import

    1. データベースを作成します。 データベースを作成した場合は、この手順をスキップしてください。

      CREATE DATABASE adb_demo; 
    2. OSS外部テーブルを作成します。

      説明
      • AnalyticDB for MySQLのOSS外部テーブルは、OSSオブジェクトと同じフィールドの名前、番号、順序、およびデータ型を使用する必要があります。

      • エラスティックインポートメソッドでは、create TABLEステートメントを使用してのみ外部テーブルを作成できます。

      CREATE TABLE oss_import_test_external_table
      (
        id INT(1023),
        name VARCHAR(1023),
        age INT,
        dt VARCHAR(1023)
      )
      ENGINE='OSS'
      TABLE_PROPERTIES='{
          "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com",
          "url":"oss://<bucket-name>/adb/oss_import_test_data.csv",
          "accessid":"LTAI5t8sqJn5GhpBVtN8****",
          "accesskey":"HlClegbiV5mJjBYBJHEZQOnRF7****",
          "delimiter":","
      }';
      重要

      外部テーブルを作成するときは、CSV、Parquet、またはORC外部テーブルに次のTABLE_PROPERTIESパラメーターを設定できます。

      • CSV: endpointurlaccessidaccesskeyformatdelimiternull_valuepartition_column

      • Parquet: endpointurlaccessidaccesskeyformatpartition_column

      • ORC: endpointurlaccessidaccesskeyformatpartition_column

      外部テーブルパラメーターの詳細については、「外部テーブルを使用してdata Warehouse Editionにデータをインポートする」トピックの「非パーティション化OSS外部テーブル」および「パーティション化OSS外部テーブル」セクションをご参照ください。

    3. データの照会

      外部テーブルを作成した後、AnalyticDB for MySQLでSELECTステートメントを実行して、外部テーブルのデータをクエリできます。

      SELECT * FROM oss_import_test_external_table;

      サンプル結果:

      +------+-------+------+-----------+
      | id   | name  | age  | dt        |
      +------+-------+------+-----------+
      |    1 | james |   10 |2023-06-15 |
      |    2 | bond  |   20 |2023-06-15 |
      |    3 | jack  |   30 |2023-06-15 |
      |    4 | lucy  |   40 |2023-06-15 |
      +------+-------+------+-----------+
      4 rows in set (0.35 sec)
    4. AnalyticDB for MySQLクラスターにテーブルを作成し、OSSからインポートされたデータを保存します。

      説明

      作成した内部テーブルは、手順bで作成した外部テーブルと同じフィールド名、番号、順序、およびデータ型を使用する必要があります。

      CREATE TABLE adb_import_test
      (
        id INT,
        name VARCHAR(1023),
        age INT,
        dt VARCHAR(1023)
        primary key(id)
      )
      DISTRIBUTED BY HASH(uid);
    5. データをインポートする。

      重要

      elastic importメソッドでは、INSERT OVERWRITE INTOステートメントを使用してのみデータをインポートできます。

      • 方法1: INSERT OVERWRITE INTOステートメントを実行して、データを弾力的にインポートします。 主キーの値が重複している場合、元の値は新しい値で上書きされます。

        /+*elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/
        INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_demo.oss_import_test_external_table;
      • 方法2: INSERT OVERWRITE INTO文を非同期的に実行して、データを弾力的にインポートします。 ほとんどの場合、SUBMIT JOBステートメントは非同期ジョブの送信に使用されます。

        /*elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/
        SUBMIT JOB INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_demo.oss_import_test_external_table;
        重要

        エラスティックインポートジョブを非同期で送信する場合、優先キューを設定できません。

        サンプル結果:

        +---------------------------------------+
        | job_id                                |
        +---------------------------------------+
        | 2023081517195102101701907203151****** |

      [ジョブの送信] ステートメントを使用して非同期ジョブを送信すると、ジョブIDのみが返されます。これは、非同期ジョブが正常に送信されたことを示します。 返されたジョブIDを使用して、非同期ジョブを終了したり、非同期ジョブのステータスを照会したりできます。 詳細については、「インポートジョブの非同期送信」をご参照ください。

      ヒントパラメータ:

      • elastic_load: elastic_importを使用するかどうかを指定します。 有効な値: trueおよびfalse。 デフォルト値:false

      • elastic_load_configs: エラスティックインポート機能の設定パラメーター。 パラメーターを括弧 ([ ]) で囲み、複数のパラメーターを縦棒 (|) で区切る必要があります。 次の表にパラメーターを示します。

        パラメーター

        必須

        説明

        adb.load.resource.group.name

        必須

        エラスティックインポートジョブを実行するジョブリソースグループの名前。

        adb.load.job.max.acu

        選択可能

        エラスティックインポートジョブのリソースの最大量。 単位: AnalyticDBコンピューティングユニット (ACU) 。 最小値: 5 ACU。 デフォルト値: シャード数 + 1

        次のステートメントを実行して、クラスター内のシャードの数を照会します。

        SELECT count(1) FROM information_schema.kepler_meta_shards;

        spark.driver.resourceSpec

        選択可能

        Sparkドライバーのリソースタイプ。 デフォルト値: small。 有効な値の詳細については、Conf設定パラメータートピックの「Sparkリソースの仕様」テーブルの「タイプ」列を参照してください。

        spark.exe cutor.resourceSpec

        選択可能

        Sparkエグゼキュータのリソースタイプ。 デフォルト値: large。 有効な値の詳細については、Conf設定パラメータートピックの「Sparkリソースの仕様」テーブルの「タイプ」列を参照してください。

        spark.adb.exe cutorDiskSize

        選択可能

        Sparkエグゼキュータのディスク容量。 有効な値: (0,100) 。 単位は USD / GiB です。 デフォルト値: 10 GiB 詳細については、「Conf設定パラメーター」トピックの「ドライバーとエグゼキューターリソースの指定」をご参照ください。

    6. (オプション) 送信されたジョブがエラスティックインポートジョブであるかどうかを確認します。

      SELECT job_name, (job_type == 3) AS is_elastic_load FROM INFORMATION_SCHEMA.kepler_meta_async_jobs where job_name = "2023081818010602101701907303151******"

      サンプル結果:

      +---------------------------------------+------------------+
      | job_name                              | is_elastic_load  |
      +---------------------------------------+------------------+
      | 2023081517195102101701907203151****** |       1          |
      +---------------------------------------+------------------+

      エラスティックインポートジョブが送信されると、is_elastic_loadパラメーターの1が返されます。 通常のインポートジョブが送信されると、0が返されます。