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

AnalyticDB:データのインポートとクエリ

最終更新日:Jun 07, 2024

AnalyticDB for MySQLは、さまざまなシナリオでデータを同期するためのさまざまなソリューションを提供します。 このトピックでは、Object Storage Service (OSS) からadb_demoという名前のAnalyticDB for MySQLデータベースにオブジェクトをインポートし、AnalyticDB for MySQLのデータを照会する方法について説明します。

前提条件

  • 次の操作を実行して、AnalyticDB for MySQLクラスターからインポートされたデータを保存することにより、OSSバケットにディレクトリが作成されます。
    1. OSSの有効化 詳細については、「OSSの有効化」をご参照ください。
    2. OSS バケットを作成します。 詳細については、「バケットの作成」をご参照ください。
      重要 OSSバケットがAnalyticDB for MySQLクラスターと同じリージョンにあることを確認します。
    3. ディレクトリを作成します。 詳細については、「ディレクトリの作成」をご参照ください。
    4. オブジェクトのアップロード 詳細については、「オブジェクトのアップロード」をご参照ください。
      この例では、oss_import_test_data.txtオブジェクトがOSSの <bucket-nam e>.oss-cn-hangzhou.aliyuncs.com/adb/ ディレクトリにアップロードされます。 行の区切り文字は改行で、列の区切り文字はセミコロン (;) です。 次のコードは、このオブジェクトに含まれるデータの一部を示しています
      。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クラスターが作成されました。 クラスターにホワイトリストが設定されています。 クラスターのアカウントとデータベースが作成されます。 詳細については、「AnalyticDB For MySQL Data Warehouse Edition (V3.0) の使用」をご参照ください。

手順

  1. CREATE TABLEステートメントを実行して、adb_demoデータベースに外部テーブルを作成します。 CSV、Parquet、またはTEXT形式のオブジェクトのOSS外部テーブルを作成する方法の詳細については、このトピックの「OSS外部テーブルを作成するための構文」をご参照ください。
  2. OSSデータを照会します。

    AnalyticDB for MySQLテーブルデータをクエリするのと同じ方法で、外部テーブルデータをクエリできます。 例:

    uidを選択します。oss_import_test_external_tableから、uid < 100制限10;
    • オブジェクトがCSV形式またはTEXT形式で、大量のデータが含まれている場合は、データをクエリする前にAnalyticDB for MySQLにオブジェクトをインポートすることをお勧めします。 そうしないと、クエリのパフォーマンスが低下する可能性があります。
    • オブジェクトがParquet形式の場合、データを直接クエリするか、データをクエリする前にオブジェクトをAnalyticDB for MySQLにインポートするかを決定できます。
  3. CREATE TABLEステートメントを実行して、adb_oss_import_testという名前のターゲットテーブルをadb_demoデータベースに作成し、OSSからインポートされたデータを保存します。
    が存在しない場合はテーブルを作成します。adb_oss_import_test
    (
        uid文字列、
        その他の文字列
    )
    ハッシュによって分布 (uid); 
  4. を実行するExecute anインサート文を使用して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」をご参照ください。 例:

      adb_oss_import_testに挿入
      SELECT * からoss_import_test_external_table; 
    • 方法2: INSERT OVERWRITEステートメントを実行してデータをインポートします。 主キーの値が重複している場合、元の値は新しい値で上書きされます。 例:

      INSERT OVERWRITE adb_oss_import_test
      SELECT * からoss_import_test_external_table; 
    • 方法3: INSERT OVERWRITEステートメントを実行して、データを非同期的にインポートします。 ほとんどの場合、SUBMIT JOBステートメントは非同期ジョブの送信に使用されます。 ジョブを高速化するために、データインポートステートメントの前にヒント (/* + direct_batch_load=true */) を追加できます。 詳細については、「INSERT OVERWRITE SELECT」トピックの「非同期書き込み」セクションをご参照ください。 例:

      ジョブ挿入の上書きを送信adb_oss_import_test
      SELECT * からoss_import_test_external_table; 

      サンプル結果:

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

      非同期ジョブの送信方法については、「インポートジョブの非同期送信」をご参照ください。

  5. 次のステートメントを実行して、adb_oss_import_testテーブルのデータを照会します。
    SELECT * からadb_oss_import_test;

OSS外部テーブルを作成するための構文

  • CSV形式のオブジェクトのOSS外部テーブルの作成

    • oss_import_test_data.txtオブジェクトはCSV形式です。 次のセクションでは、CSV形式のオブジェクトのOSS外部テーブルを作成する方法について説明します。

      テーブルを作成しない場合は、oss_import_test_external_table
      (
          uid文字列、
          その他の文字列
      )
      エンジン='OSS'
      TABLE_PROPERTIES='{
          "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com" 、
          "url":"oss://<bucket-name>/adb_data/" 、
          "accessid":"LTAIF **** 5FsE" 、
          "accesskey":"Ccw **** iWjv" 、
          "delimiter":";",
          "skip_header_line_count":1、} '; 

      パラメーター

      必須

      説明

      エンジン='OSS'

      外部テーブルに使用されるストレージエンジン (OSS) 。

      テーブル_プロパティ

      AnalyticDB for MySQLがOSSへのアクセスに使用する接続情報。

      エンドポイント

      OSSバケットのエンドポイント

      説明

      AnalyticDB for MySQLは、VPC経由でElastic Compute Service (ECS) インスタンスからのみOSSにアクセスできます。

      OSSコンソールにログインしてバケットを見つけ、[概要] ページでエンドポイントを表示します。

      url

      OSS内のソースオブジェクトまたはディレクトリの絶対パス。 ディレクトリの絶対パスの末尾にスラッシュ (/) を使用することをお勧めします。

      例:

      • オブジェクト: oss://<bucket-name>/adb/oss_import_test_data.csv

      • ディレクトリ: oss://<bucket-name>/adb_data/

        説明

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

      accessid

      OSSのオブジェクトまたはディレクトリへのアクセスに使用されるAccessKey ID。

      AccessKey IDとAccessKeyシークレットの取得方法については、「アカウントと権限」をご参照ください。

      accesskey

      OSSのオブジェクトまたはディレクトリへのアクセスに使用されるAccessKeyシークレット。

      区切り文字

      CSV形式のオブジェクトの列区切り文字。 たとえば、列の区切り文字をコンマ (,) に設定できます。

      null_値

      任意

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

      説明

      このパラメーターは、V3.1.4.2以降のAnalyticDB for MySQLクラスターでのみサポートされます。 詳細については、「リリースノート」をご参照ください。

      ossnull

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

      • 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クラスターでのみサポートされます。 詳細については、「リリースノート」をご参照ください。

  • Parquet形式またはORC形式のオブジェクトのOSS外部テーブルの作成

    • 次のステートメントは、Parquet形式で外部テーブルを作成する方法を示しています。

      テーブルを作成しない場合は、oss_import_test_external_table
      (
          uid文字列、
          その他の文字列
      )
      エンジン='OSS'
      TABLE_PROPERTIES='{
          "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com" 、
          "url":"oss://<bucket-name>/adb_data/" 、
          "accessid":"LTAIF **** 5FsE" 、
          "accesskey":"Ccw **** iWjv" 、
          "format":"parquet"
      } '; 

      パラメーター

      説明

      エンジン='OSS'

      外部テーブルに使用されるストレージエンジン (OSS) 。

      テーブル_プロパティ

      AnalyticDB for MySQLがOSSへのアクセスに使用する接続情報。

      エンドポイント

      OSSバケットのエンドポイント

      説明

      AnalyticDB for MySQLはVPC経由のECSインスタンスからのみOSSにアクセスできます。

      OSSコンソールにログインしてバケットを見つけ、[概要] ページでエンドポイントを表示します。

      url

      OSS内のソースオブジェクトまたはディレクトリの絶対パス。 ディレクトリの絶対パスの末尾にスラッシュ (/) を使用することをお勧めします。

      例:

      • オブジェクト: oss://<bucket-name>/adb/oss_import_test_data.parquet

      • ディレクトリ: oss://<bucket-name>/adb_data/

      説明
      • 外部テーブルを作成するときは、urlパラメーターに実際の絶対パスを指定します。

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

      accessid

      OSSのオブジェクトまたはディレクトリへのアクセスに使用されるAccessKey ID。

      AccessKey IDとAccessKeyシークレットの取得方法については、「アカウントと権限」をご参照ください。

      accesskey

      OSSのオブジェクトまたはディレクトリへのアクセスに使用されるAccessKeyシークレット。

      形式

      オブジェクトの形式。

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

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

      説明

      このパラメーターを指定しない場合は、CSV形式が使用されます。

      説明
      • 外部テーブルを作成するためにステートメントで使用される列名は、ParquetまたはORCファイルの列名と同じである必要があります。 列名は大文字と小文字を区別しません。 ステートメントの列の順序は、ParquetまたはORCファイルの列の順序と同じである必要があります。

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

      • 外部テーブルの作成に使用されるステートメントにParquetまたはORCファイルにない列が含まれている場合、この列にはNULLが返されます。

      Parquet形式のオブジェクトの外部テーブルを作成する場合は、次のデータ型間のマッピングに注意してください。

      次の表は、ParquetとAnalyticDB for MySQL V3.0のデータ型間のマッピングを示しています。

      基本タイプin Parquet

      Parquetの論理型

      AnalyticDB for MySQL V3.0のデータ型

      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

      日付

      日付

      INT64

      TIMESTAMP_MILLIS

      TIMESTAMPまたはDATETIME

      INT96

      N/A

      TIMESTAMPまたはDATETIME

      重要

      STRUCTデータ型の列を使用するParquet外部テーブルは作成できません。

ParquetまたはCSV形式のパーティションオブジェクトのOSS外部テーブルを作成する

パーティションを含むOSSデータ用に階層ディレクトリが生成されます。 例:

parquet_partition_classic /
â ─ ─ p1=2020-01-01
│ ├─ ─ p2=4
│ │ ├─ ─ p3=上海
│ │ │ ├─ 000000_0
│ │ │ ά ─ 000000_1
│ │ 様 ─ ─ p3=深セン
│ │ ά ─ ─ 000000_0
│ õ ─ ─ p2=6
│ õ ─ ─ p3=深セン
│ └ ─ ─ 000000_0
â ─ ─ p1=2020-01-02
│ õ ─ ─ p2=8
│ ├─ ─ p3=上海
│ │ ά ─ ─ 000000_0
│ õ ─ ─ p3=深セン
│ └ ─ ─ 000000_0
└ ─ ─ p1=2020-01-03
    └ ─ ─ p2=6
        â ─ ─ p2=杭州
        └ ─ ─ p3=深セン
            └ ─ ─ 000000_0 

上記の例では、p1はレベル1のパーティションを示し、p2はレベル2のパーティションを示し、p3はレベル3のパーティションを示します。 パーティションごとにデータをクエリする場合は、OSS外部テーブルの作成に使用するステートメントでパーティション列を指定する必要があります。 次のステートメントは、OSS外部テーブルを作成し、外部テーブルでパーティション列を指定する方法を示しています。 この例では、Parquetオブジェクトが使用されます。

oss_parquet_partition_tableが存在しない場合は
CREATE TABLE
(
  uid varchar,
  その他のvarchar,
  p1日付、
  p2 int,
  p3 varchar
)
エンジン='OSS'
TABLE_PROPERTIES='{
  "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com" 、
  "url":"oss://<bucket-name>/adb/oss_parquet_data_dir" 、
  "accessid":"LTAIF **** 5FsE" 、
  "accesskey":"Ccw **** iWjv" 、
  "format":"parquet" 、
  "partition_column":"p1, p2, p3"
} '; 
説明
  • TABLE_PROPERTIESpartition_columnプロパティは、パーティション列 (例ではp1、p2、p3など) を宣言する必要があります。 partition_columnで指定されるパーティション列のシーケンスは、外部テーブルの作成に使用されるステートメントで定義されているパーティション列のシーケンスと同じである必要があります。

  • 外部テーブルでパーティション列を定義する場合は、パーティションを含む列 (例のp1、p2、p3など) とそのデータ型を指定する必要があります。 ステートメントの最後にパーティション列を指定する必要があります。

  • 外部テーブルの作成に使用されるステートメントで定義されているパーティション列の順序は、partition_columnプロパティで指定されているパーティション列の順序と同じである必要があります。

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

  • パーティション列のクエリに使用される構文と、クエリ結果の表示方法は、他の列と同じです。

  • formatパラメーターが指定されていない場合は、CSV形式が使用されます。

関連ドキュメント

AnalyticDB For MySQLにデータをインポートする方法の詳細については、「サポートされているデータソース」をご参照ください。