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

:レイクハウスと外部テーブルに関するよくある質問

最終更新日:Mar 27, 2026

このトピックでは、外部テーブルに関するよくある質問 (FAQ) に回答します。

カテゴリ

よくある質問

Object Storage Service (OSS) 外部テーブル

Hologres 外部テーブル

MaxCompute から Hologres データを直接読み取る際の ODPS-0130071 エラーの解決方法

パフォーマンスの問題

外部テーブルでの SQL ジョブの低速化に関するトラブルシューティング方法

ODPS-0123131 エラー:カスタムエクストラクタによる DATETIME 型の読み取り

  • 問題

    カスタムエクストラクタを使用して非構造化データを読み取る際、データフィールドが 2019-11-11 06:43:36 のような DATETIME 型の場合、以下のエラーが報告されます。

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.IllegalArgumentException
        at java.sql.Date.valueOf(Date.java:143)
        at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194)
        at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153)
        at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120)       
  • 原因

    コード Date.valueOf(parts[i]) において、java.sql.Date.valueOf() 関数は "yyyy-[m]m-[d]d" 形式の STRING パラメーターのみをサポートし、DATETIME パラメーターはサポートしていません。

  • 解決策

    1. Joda-Time の依存関係をプロジェクトに追加し、必要なクラスをコードにインポートします。

      -- 依存関係
      <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10</version>
      </dependency> 
      -- インポート情報
      import org.joda.time.DateTime;
      import org.joda.time.format.DateTimeFormat;                           
    2. DateTimeFormat.forPattern() 関数を使用して、DATETIME 型の値を STRING 型に変換して読み取ります。

      record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));                           

    例:

    1. MaxCompute クライアントを使用して、エクストラクタプロジェクトの JAR ファイルをアップロードします。

      add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar      

      /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar は、生成された JAR ファイルのローカルストレージパスです。

    2. MaxCompute クライアントを使用して、サードパーティの Joda-Time JAR ファイルをアップロードします。

      add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar                         

      /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar は、サードパーティの Joda-Time JAR ファイルのローカルパスです。

    3. テストデータを OSS の指定されたディレクトリにアップロードします。video_play_log.txt という名前のファイルの場合、サンプルデータは次のようになります。

      5c661071dba64d5080c91da085ff1073^Music-Click-Fast forward^26.12.XX.XX^2019-11-11 06:43:36                           
    4. 外部テーブルからデータを読み取ります。

      select * from <project_name>.video_play_log;
      +------+-------+---+----------------+
      | uuid  | action  | ip  | time      |
      +------+-------+---+----------------+
      | 5c661071dba64d5080c91da085ff1073 | Music-Click-Fast forward | 26.12.XX.XX | 2019-11-11 06:43:36 |
      +------+-------+---+----------------+     

OSS 外部テーブル上の UDF でのメモリオーバーフロー

  • 問題

    UDF (ユーザー定義関数) を使用して OSS 外部テーブルにアクセスすると、UDF がローカルテストに合格したにもかかわらず、メモリオーバーフローエラーが発生します。

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.OutOfMemoryError: Java heap space        

    以下のパラメーターを設定した後も、ランタイムは増加しますが、エラーは解決しません。

    set odps.stage.mapper.mem = 2048; 
    set odps.stage.mapper.jvm.mem = 4096;       
  • 原因

    外部テーブルに含まれるオブジェクトファイルが多すぎることが原因で、大量のメモリが消費されます。さらに、パーティションが設定されていません。

  • 解像度

    • より少量のデータをクエリします。

    • パーティションを使用して、各クエリでスキャンされるデータ量を減らします。

エラー:「Inline data exceeds maximum allowed size」

  • 問題

    Object Storage Service (OSS) のデータを処理する際に、Inline data exceeds the maximum allowed size というエラーが発生します。

  • 原因

    MaxCompute が OSS 外部テーブルにデータを書き込む際、操作上のサイズ制限を超える単一ファイルを作成しようとすることがあります。

  • 解像度

    実行計画を制御するために、次のプロパティを調整します。これにより、OSS 外部テーブルに書き込まれる個々のファイルがサイズ制限を超えないようにします。

    -- 各マッパーが読み取るデータ量を調整します。単位:MB
    SET odps.sql.mapper.split.size=256; 
    -- reduce フェーズのワーカー数を調整します。
    SET odps.stage.reducer.num=100; 

OSS 外部テーブルを使用した JSON データの読み取り

手順については、「OSS 外部テーブルを使用した JSON データの読み取り」をご参照ください。

OSS 外部テーブルを使用した小規模ファイルのマージ

Logview ログを使用して、SQL 実行計画の最後のオペレーターが Reducer か Joiner かを確認します。Reducer の場合は set odps.stage.reducer.num=1; 文を実行します。Joiner の場合は set odps.stage.joiner.num=1; 文を実行します。

ODPS-0130071 エラー:MaxCompute からの Hologres データの読み取り

  • 問題

    Hologres から直接データを読み取る際に、「ODPS-0130071 Failed to split to equal size...max count: 7777」というエラーが報告されます。例:

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777
  • 原因

    このエラーは、MaxCompute のデフォルトのマッパー分割戦略 (入力データ量 / split.size = 256 MB) により、同時実行マッパー数が最大制限の 7,777 を超えるために発生します。

    説明

    この制限は、ユーザーが多数のマッパーを生成するジョブを送信し、Hologres の安定性やネットワーク接続に影響を与えるのを防ぐためのものです。

  • 解決策

    以下のパラメーターを設定することで、このエラーを解決できます。

    -- マッパーの同時実行数制限を増やします。最大値は 10,000 です。
    SET odps.external.holo.mapper.instances=10000; 
    -- 分割サイズを増やすことで、タスクの同時実行数を調整します。最大値は 512 MB です。
    SET odps.sql.mapper.split.size=512; 

外部テーブルでの SQL ジョブの低速化

外部テーブルでの SQL ジョブが遅くなる一般的な理由がいくつかあります:

  • OSS 外部テーブルからの GZ 圧縮ファイルの読み取りが遅い

    • 問題

      OSS 外部テーブルから大規模な圧縮ファイル (例:200 GB の GZ ファイル) を読み取るのが遅い。

    • 原因

      GZ のような圧縮形式は分割不可能なため、MaxCompute は単一のマッパーしか使用できず、ジョブが遅くなります。

    • 解決策

      • パフォーマンスを向上させるには、大きな圧縮ファイルを OSS 内の複数の小さなファイルに分割します。これにより、MaxCompute は複数のマッパーを並行して使用できるようになり、読み取りスループットが向上します。

        -- 各マッパーのデータ分割サイズを MB 単位で設定します。
        SET odps.sql.mapper.split.size=256;       
      • 非構造化データの場合、Object Storage Service (OSS) 外部テーブルのパスにファイルが 1 つしか含まれていないか確認します。圧縮された非構造化データは分割できないため、ファイルが 1 つしかない場合、生成されるマッパーは 1 つだけになり、処理が遅くなります。OSS 外部テーブルのパスにある大きな OSS ファイルを小さなファイルに分割します。これにより、マッパーの数が増え、読み取り速度が向上します。

  • SDK を使用した MaxCompute 外部テーブルでのデータクエリが遅い

    • 問題

      SDK を使用して MaxCompute 外部テーブルからデータをクエリするのが遅い。

    • 解決策

      外部テーブルはフルテーブルスキャンのみをサポートしているため、処理が遅くなることがあります。代わりに MaxCompute 内部テーブルを使用することを推奨します。

  • Tablestore 外部テーブルからのデータクエリが遅い

    • 問題

      Tablestore 外部テーブルに対するクエリが、同じデータを含む MaxCompute 内部テーブルに対する同等のクエリよりも大幅に遅い。

    • 解像度

      外部テーブルのクエリにはリモートでのデータ読み取りが含まれるため、このパフォーマンスの違いは想定内です。パフォーマンスを向上させるには、まずデータを MaxCompute 内部テーブルにインポートしてからクエリを実行します。

OSS 外部テーブルでの「Couldn't connect to server」エラー

  • 問題

    OSS 外部テーブルからデータを読み取る際に、次のエラーが報告されます:ODPS-0123131:User defined function exception - common/io/oss/oss_client.cpp(95): OSSRequestException: req_id: , http status code: -998, error code: HttpIoError, message: Couldn't connect to server

  • 原因

    • 原因 1:OSS 外部テーブルを作成する際に、oss_location の oss_endpoint に内部エンドポイントではなく、パブリックエンドポイントが使用されている。

    • 原因 2:OSS 外部テーブルを作成する際に、oss_location パスで指定された oss_endpoint が異なるリージョンに属している。

  • 解決策

    • 原因 1 の場合:

      OSS 外部テーブルの CREATE TABLE 文の oss_location パラメーターを確認する必要があります。oss_endpoint がパブリックエンドポイントである場合は、内部エンドポイントに変更してください。パラメーターの詳細については、「パラメーターの説明」をご参照ください。

      たとえば、インドネシア (ジャカルタ) リージョンで oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/.... エンドポイントを使用して外部テーブルを作成する場合、対応する内部エンドポイント oss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/.... に変更する必要があります。

    • 原因 2 の場合:

      OSS 外部テーブルの CREATE TABLE 文の oss_location パラメーターにある oss_endpoint が、アクセスしたいリージョンのエンドポイントであることを確認する必要があります。OSS クラシックネットワークのドメイン名の詳細については、「リージョンとエンドポイント」をご参照ください。

テーブル作成時の「Network is unreachable (connect failed)」エラー

  • 問題

    Object Storage Service (OSS) の外部テーブルを作成する際に、次のエラーが報告されます:ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: Cannot connect to the endpoint 'oss-cn-beijing.aliyuncs.com': Connect to bucket.oss-cn-beijing.aliyuncs.com:80 [bucket.oss-cn-beijing.aliyuncs.com] failed: Network is unreachable (connect failed)

  • 原因

    OSS 外部テーブルの作成時に、oss_location アドレスの oss_endpoint が内部エンドポイントではなく、パブリックエンドポイントを使用している。

  • 解像度

    OSS 外部テーブルの CREATE TABLE 文を確認し、oss_location パラメーターで指定された oss_endpoint が内部エンドポイントであることを確認する必要があります。パブリックエンドポイントである場合は、内部エンドポイントに変更する必要があります。パラメーターの詳細については、「パラメーターの説明」をご参照ください。

    たとえば、中国 (北京) リージョンで oss://oss-cn-beijing.aliyuncs.com/<bucket>/.... エンドポイントを使用して外部テーブルを作成する場合、対応する内部エンドポイント oss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/.... に変更する必要があります。