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

MaxCompute:OSS 外部テーブル

最終更新日:Mar 01, 2026

MaxCompute では、プロジェクト内に Object Storage Service (OSS) 外部テーブルを作成して、OSS 内のディレクトリにマッピングできます。OSS 外部テーブルを使用すると、OSS ディレクトリ内のファイルから非構造化データにアクセスしたり、MaxCompute プロジェクトから OSS ディレクトリにデータを書き込んだりできます。このトピックでは、OSS 外部テーブルの作成、読み取り、書き込みの構文とパラメーターについて説明します。

適用範囲

  • OSS 外部テーブルはクラスタープロパティをサポートしていません。

  • 単一ファイルのサイズは 2 GB を超えることはできません。2 GB を超えるファイルは分割する必要があります。

  • MaxCompute と OSS は同じリージョンにある必要があります。

アクセス方法

以下のプラットフォームを使用して、OSS 外部テーブルを作成し、データの読み取りまたは書き込みを行うことができます。

方法

プラットフォーム

MaxCompute SQL

可視化

前提条件

  • MaxCompute プロジェクトを作成済みであること。

  • OSS バケットとディレクトリを準備します。詳細については、「バケットの作成」および「ディレクトリの管理」をご参照ください。

    MaxCompute は OSS 内にディレクトリを自動的に作成できます。SQL 文に外部テーブルとユーザー定義関数 (UDF) が含まれている場合、単一の SQL 文を使用して外部テーブルの読み取りと書き込み、および UDF の実行ができます。手動でディレクトリを作成する従来の方法もサポートされています。

    MaxCompute は一部のリージョンにのみデプロイされているため、リージョン間のネットワーク接続に問題が発生する可能性があります。バケットは MaxCompute プロジェクトと同じリージョンに保持してください。
  • 権限付与

    • OSS へのアクセス権限を取得します。Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールを使用して OSS 外部テーブルにアクセスできます。権限付与情報については、「OSS の STS 認証」をご参照ください。

    • MaxCompute プロジェクトで CreateTable 権限を取得します。テーブル操作の権限に関する詳細については、「MaxCompute 権限」をご参照ください。

OSS 外部テーブルの作成

  • パーティションテーブルと非パーティションテーブル: OSS 外部テーブルは、パーティションテーブルまたは非パーティションテーブルにすることができます。タイプは、OSS 内のデータファイルのストレージパスによって決まります。データファイルがパーティションパスに保存されている場合は、パーティションテーブルを作成します。それ以外の場合は、非パーティションテーブルを作成します。

  • ネットワークドメイン名:OSS にはクラシックネットワークのドメイン名を使用します。MaxCompute は、パブリックネットワークのドメイン名に対するネットワーク接続を保証しません。

  • OSS 外部テーブルは、OSS ディレクトリへのマッピングのみを記録します。OSS 外部テーブルを削除しても、マッピングされた OSS ディレクトリ内のデータファイルは削除されません。

  • OSS データファイルがアーカイブ済みオブジェクトの場合、まずオブジェクトを復元する必要があります。

OSS 外部テーブルを作成するステートメントは、異なるフォーマットのデータファイルに対して異なるパラメーター設定を持ちます。構文とパラメーターの説明に基づいて、ビジネスニーズに合った外部テーブルを作成してください。そうしないと、OSS からのデータ読み取りまたは OSS へのデータ書き込み操作が失敗します。

構文

組み込みテキストデータパーサーを使用した外部テーブルの作成

構文

データファイル形式

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> 
(
<col_name> <data_type>,
...
)
[comment <table_comment>]
[partitioned BY (<col_name> <data_type>, ...)] 
stored BY '<StorageHandler>'  
WITH serdeproperties (
 ['<property_name>'='<property_value>',...]
) 
location '<oss_location>';

OSS からの読み取りまたは OSS への書き込みでサポートされているデータファイル形式:

  • CSV

  • TSV

  • GZIP、SNAPPY、または LZO で圧縮された CSV および TSV ファイル

組み込みオープンソースデータパーサーを使用した外部テーブルの作成

構文

データファイル形式

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[comment <table_comment>]
[partitioned BY (<col_name> <data_type>, ...)]
[row format serde '<serde_class>'
  [WITH serdeproperties (
    ['<property_name>'='<property_value>',...])
  ]
]
stored AS <file_format> 
location '<oss_location>' 
[USING '<resource_name>']
[tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];

OSS からの読み取りまたは OSS への書き込みでサポートされているデータファイル形式:

  • PARQUET

  • TEXTFILE

  • ORC

  • RCFILE

  • AVRO

  • JSON

  • SEQUENCEFILE

  • Hudi (DLF によって生成された Hudi データの読み取りのみをサポート)

  • ZSTD、SNAPPY、または GZIP で圧縮された PARQUET ファイル

  • SNAPPY または ZLIB で圧縮された ORC ファイル

  • GZIP、SNAPPY、または LZO で圧縮された TEXTFILE ファイル

カスタムパーサーを使用した外部テーブルの作成

構文

データファイル形式

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> 
(
<col_name> <date_type>,
...
)
[comment <table_comment>]
[partitioned BY (<col_name> <data_type>, ...)] 
stored BY '<StorageHandler>' 
WITH serdeproperties (
 ['<property_name>'='<property_value>',...]
) 
location '<oss_location>' 
USING '<jar_name>';

OSS からの読み取りまたは OSS への書き込みでサポートされているデータファイル形式:上記以外の形式のデータファイル。

パラメーター

以下は、さまざまな形式の外部テーブルに共通のパラメーターです。固有のパラメーターについては、各外部テーブル形式のドキュメントをご参照ください。

  • 基本構文パラメーター

    パラメーター

    必須

    説明

    mc_oss_extable_name

    はい

    作成する OSS 外部テーブルの名前。

    テーブル名は大文字と小文字を区別しません。外部テーブルをクエリする際に大文字と小文字を区別する必要はなく、強制的に大文字小文字を変換することはできません。

    col_name

    はい

    OSS 外部テーブルの列の名前。

    OSS からデータを読み取る際、作成された OSS 外部テーブルのスキーマは OSS データファイルのスキーマと同じでなければなりません。そうでない場合、データは読み取れません。

    data_type

    はい

    OSS 外部テーブルの列のデータ型。

    OSS からデータを読み取る際、OSS 外部テーブルの各列のデータ型は、OSS データファイルの対応する列のデータ型と同じでなければなりません。そうでない場合、データは読み取れません。

    table_comment

    いいえ

    テーブルのコメント。コメントは 1,024 バイト以下の有効な文字列でなければなりません。そうでない場合、エラーが報告されます。

    partitioned by (col_name data_type, ...)

    いいえ

    OSS 内のデータファイルがパーティションパスに保存されている場合、このパラメーターを含めてパーティションテーブルを作成します。

    • col_name:パーティションキー列の名前。

    • data_type:パーティションキー列のデータ型。

    '<(tb)property_name>'='<(tb)property_value>'

    はい

    OSS 外部テーブルの拡張プロパティ。パラメーターの詳細については、各形式の固有パラメーターのドキュメントをご参照ください。

    oss_location

    はい

    データファイルが配置されている OSS パス。デフォルトでは、このパス内のすべてのデータファイルが読み取られます。

    形式は oss://<oss_endpoint>/<Bucket name>/<OSS directory name>/ です。

    • oss_endpoint

      • OSS ドメイン名。OSS が提供するクラシックネットワークエンドポイントを使用する必要があり、これには -internal が含まれます。

        例:oss://oss-cn-beijing-internal.aliyuncs.com/xxx

        OSS クラシックネットワークドメイン名の詳細については、「リージョンとエンドポイント」をご参照ください。

        データファイルが保存されている OSS リージョンは、MaxCompute プロジェクトのリージョンと同じにしてください。異なるリージョンにある場合、ネットワーク接続の問題が発生する可能性があります。
      • エンドポイントを指定しない場合、システムは現在のプロジェクトが配置されているリージョンのエンドポイントを使用します。

        この方法は、リージョンをまたいだファイルストレージがネットワーク接続の問題を引き起こす可能性があるため、推奨されません。
    • バケット名:OSS バケットの名前。バケット名は oss_endpoint の後に続く必要があります。

      例:oss://oss-cn-beijing-internal.aliyuncs.com/your_bucket/path/

      バケット名の表示方法については、「バケットのリスト表示」をご参照ください。

    • ディレクトリ名:OSS ディレクトリの名前。ディレクトリの後にファイル名を指定しないでください。

      例:oss://oss-cn-beijing-internal.aliyuncs.com/oss-mc-test/Demo1/

      不正な例:

       -- HTTP 接続はサポートされていません。
      http://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/
      -- HTTPS 接続はサポートされていません。               
      https://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/
      -- 不正な接続アドレス。            
      oss://oss-cn-shanghai-internal.aliyuncs.com/Demo1
      -- ファイル名を指定しないでください。                            
      oss://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/vehicle.csv
    • 権限仕様 (RamRole)

      • 明示的な指定 (推奨):カスタムロールを作成し、アクセスポリシーをアタッチし、カスタムロールの ARN を使用します。詳細については、「STS 認証」をご参照ください。

      • デフォルトの使用 (非推奨):aliyunodpsdefaultrole ロールの ARN を使用します。

  • WITH serdeproperties 属性

    property_name

    シナリオ

    property_value

    デフォルト値

    odps.properties.rolearn

    STS 認証を使用する場合にこのプロパティを追加します。

    OSS へのアクセス権限を持つ RAM ロールの ARN を指定します。

    RAM コンソールのロール詳細から ARN を取得します。例:acs:ram::xxxxxx:role/aliyunodpsdefaultrole

    • MaxCompute と OSS のオーナーが同じアカウントの場合

      • テーブル作成ステートメントで odps.properties.rolearn を指定しない場合、デフォルトで aliyunodpsdefaultrole ロールの ARN が使用されます。まず、STS 認証を使用して aliyunodpsdefaultrole ロールを作成する必要があります。

      • カスタムロールの ARN を使用するには、まずカスタムロールを作成する必要があります。詳細については、「OSS の STS 認証 (カスタム認証)」をご参照ください。

    • MaxCompute と OSS のオーナーが異なるアカウントの場合、カスタムロールの ARN を指定する必要があります。詳細については、「OSS の STS 認証 (カスタム認証)」をご参照ください。

OSS 外部テーブルへのパーティションの追加

パーティション化された OSS 外部テーブルを作成した場合、パーティションデータをインポートするための追加操作を実行する必要があります。

  • 方法 1 (推奨):OSS ディレクトリ構造を自動的に解析して、OSS 外部テーブルにパーティションを識別して追加する。

    この方法は、不足しているすべての履歴パーティションを一度に追加する必要があるシナリオに適しています。MaxCompute は、テーブル作成時に指定したパーティションディレクトリに基づいて、OSS 外部テーブルのパーティションを自動的に追加します。パーティション列名と値で一つずつ追加する必要はありません。

    MSCK REPAIR TABLE <mc_oss_extable_name> ADD PARTITIONS [ WITH properties (key:VALUE, key: VALUE ...)];
    この方法は、増分データの追加には適していません。特に、OSS ディレクトリに 1,000 を超えるような多数のパーティションが含まれている場合には不向きです。新しいパーティションの数が既存のパーティションの数よりもはるかに少ない場合、msck コマンドを頻繁に実行すると、OSS ディレクトリの繰り返しスキャンとメタデータ更新が多数発生します。これにより、コマンドの実行効率が低下します。増分パーティションを更新する必要があるシナリオでは、方法 2 を使用してください。
  • 方法 2:手動でコマンドを実行して、OSS 外部テーブルにパーティション情報を追加する。

    この方法は、履歴パーティションが作成済みで、新しいパーティションを頻繁かつ定期的に追加する必要があるシナリオに適しています。データ書き込みタスクが実行される前にパーティションを作成する必要があります。新しいデータが OSS に書き込まれた場合でも、対応するパーティションをリフレッシュする必要はありません。外部テーブルは OSS ディレクトリから最新のデータを読み取ることができます。

    ALTER TABLE <mc_oss_extable_name> 
      ADD PARTITION (<col_name>=<col_value>)[
      ADD PARTITION (<col_name>=<col_value>)...][location URL];

    col_namecol_value の値は、パーティションデータファイルが配置されているディレクトリ名と一致する必要があります。

    パーティションデータファイルの OSS ディレクトリ構造が次の図のようになっていると仮定します。col_namedirection に対応し、col_valueN, NE, S, SW, W に対応します。1 つの add partition 句は 1 つのサブディレクトリに対応します。複数の OSS サブディレクトリに対しては、複数の add partition 句を使用する必要があります。

    分区路径

OSS からのデータ読み取り

注意事項

  • OSS 外部テーブルを作成した後、外部テーブルを介して OSS からデータを読み取ることができます。サポートされている OSS データファイルの種類と OSS 外部テーブルの作成構文については、「構文」をご参照ください。

  • SQL 文に複雑なデータ型が含まれる場合は、SQL 文の前に set odps.sql.type.system.odps2=true; コマンドを追加して、一緒に送信してください。データ型の詳細については、「データ型バージョン」をご参照ください。

  • オープンソースデータにマッピングする OSS 外部テーブルの場合、OSS からデータを読み取る前にセッションレベルで set odps.sql.hive.compatible=true; を設定してください。そうしないと、エラーが報告されます。

  • OSS は限られた帯域幅リソースを提供します。短期間にデータ読み書きトラフィックがインスタンスの帯域幅制限を超えると、OSS 外部テーブルのデータ読み書き速度に直接影響します。OSS の帯域幅の詳細については、「制限とパフォーマンスメトリック」をご参照ください。

構文

<select_statement> FROM <from_statement>;
  • select_statement:SELECT 句。ソーステーブルからターゲットテーブルに挿入するデータをクエリします。

  • from_statement:FROM 句。外部テーブルの名前など、データソースを指定します。

非パーティションデータ

非パーティション OSS 外部テーブルを作成した後、次の方法で OSS からデータを読み取ることができます。

  • 方法 1 (推奨):OSS からオープンソース形式のデータを MaxCompute 内部テーブルにインポートし、その後データを読み取る。

    この方法は、繰り返し計算が必要なシナリオや、コンピューティングパフォーマンスに対する要件が高いシナリオに適しています。MaxCompute プロジェクトに OSS 外部テーブルと同じスキーマを持つ内部テーブルを作成することで、OSS データをこの内部テーブルにインポートし、その後複雑なクエリを実行できます。このアプローチは、MaxCompute の内部ストレージに対する最適化メカニズムを最大限に活用して、コンピューティングパフォーマンスを向上させます。以下はサンプルコマンドです。

    CREATE TABLE <table_internal> LIKE <mc_oss_extable_name>;
    INSERT OVERWRITE TABLE <table_internal> SELECT * FROM <mc_oss_extable_name>;
  • 方法 2:MaxCompute 内部テーブルの操作と同様に、OSS から直接データを読み取る。

    この方法は、コンピューティングパフォーマンスに対する要件が低いシナリオに適しています。内部テーブルからの読み取りとは異なり、各データ読み取り操作は OSS から直接対応するデータを取得します。

パーティションデータ

OSS 外部テーブルが作成された後、MaxCompute はサブディレクトリ内のデータファイルを含む、OSS ディレクトリ内のすべてのデータをフルスキャンします。データ量が大きい場合、フルディレクトリのスキャンは不要な I/O 消費を引き起こし、データ処理時間を増加させる可能性があります。この問題は 2 つの方法で解決できます。

  • 方法 1 (推奨):OSS 上のデータを標準パーティションパスまたはカスタムパーティションパスを使用して保存する。

    OSS 外部テーブルを作成する際には、テーブル作成ステートメントでパーティションと oss_location 情報を指定する必要があります。OSS データを標準パーティションパスを使用して保存することをお勧めします。

  • 方法 2:複数のデータストレージパスを計画する。

    複数の OSS 外部テーブルを作成して、各パスからデータを読み取ることができます。これは、各 OSS 外部テーブルが OSS データの一部を指すことを意味します。この方法は煩雑で、データ管理には効果的ではないため、お勧めしません。

標準パーティションパス形式

oss://<oss_endpoint>/<Bucket name>/<directory name>/<partitionKey1=value1>/<partitionKey2=value2>/...

例:ある会社が日々のログファイルを CSV 形式で OSS に保存し、MaxCompute を使用して毎日データを処理しています。OSS データを保存するための標準パーティションパスは次のように設定する必要があります。

oss://oss-odps-test/log_data/year=2016/month=06/day=01/logfile
oss://oss-odps-test/log_data/year=2016/month=06/day=02/logfile
oss://oss-odps-test/log_data/year=2016/month=07/day=10/logfile
oss://oss-odps-test/log_data/year=2016/month=08/day=08/logfile
...

カスタムパーティションパス形式

カスタムパーティションパス形式には、パーティション列の値のみが含まれ、パーティション列名は含まれません。例:

oss://oss-odps-test/log_data_customized/2016/06/01/logfile
oss://oss-odps-test/log_data_customized/2016/06/02/logfile
oss://oss-odps-test/log_data_customized/2016/07/10/logfile
oss://oss-odps-test/log_data_customized/2016/08/08/logfile
...

OSS のデータがパーティション化されて保存されているが、パスが標準パーティションパス形式でない場合、MaxCompute では異なるサブディレクトリを異なるパーティションにバインドしてサブディレクトリデータにアクセスできます。

解決策:OSS 外部テーブルを作成した後、alter table ... add partition ... location ... コマンドを使用してサブディレクトリを指定し、異なるサブディレクトリを異なるパーティションにバインドします。以下はサンプルコマンドです。

ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '01')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/06/01/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '02')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/06/02/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '07', day = '10')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/07/10/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '08', day = '08')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/08/08/';

クエリの最適化

  • 動的統計収集

    データは外部データレイクに保存されており、既存の統計情報がないため、クエリオプティマイザーは保守的な戦略を使用し、クエリ効率が低くなります。動的統計収集機能により、オプティマイザーはクエリ実行中に一時的にテーブル統計を収集して小規模なテーブルを識別できます。その後、ハッシュ結合などの手法を積極的に使用し、結合順序を最適化し、シャッフルを削減し、実行パイプラインを短縮してクエリの最適化を実現します。

    以下のパラメーターは、Paimon、Hudi、または Delta Lake 外部テーブルには適用されません。

    SET odps.meta.exttable.stats.onlinecollect=true;
    SELECT * FROM <tablename>;
  • 外部テーブルの分割の最適化

    分割サイズパラメーターを設定して、単一の同時実行タスクで処理されるデータ量を調整することで、クエリ効率を最適化できます。分割サイズの設定には次の効果があります。

    • テーブルのデータ量が非常に大きく、毎回読み取るデータ量が少なすぎる場合、分割数が多すぎて過剰な並列処理が発生します。その結果、インスタンスはほとんどの時間をリソースの待機に費やします。

    • テーブルのデータ量が非常に少なく、毎回読み取るデータ量が多すぎる場合、分割数が少なすぎて同時実行性が不足します。その結果、ほとんどのリソースがアイドル状態になります。

    -- 以下のパラメーターのいずれかを使用できます。
    
    -- 単位:MiB。デフォルト値:256 MiB。内部または外部テーブルに適用されます。
    SET odps.stage.mapper.split.size=<value>;
    SELECT * FROM <tablename>;
    
    -- 単位:MiB。デフォルト値:256 MiB。外部テーブルにのみ適用されます。
    SET odps.sql.unstructured.data.split.size=<value>;
    SELECT * FROM <tablename>;

OSS へのデータ書き込み

OSS からのデータ読み取りと同様に、MaxCompute では内部テーブルからのデータや外部テーブルから処理されたデータを OSS に書き込むことができます。制限事項の詳細については、「適用範囲」をご参照ください。

構文

INSERT {INTO|OVERWRITE} TABLE <table_name> PARTITION (<ptcol_name>[, <ptcol_name> ...]) 
<select_statement> FROM <from_statement>;

パラメーター

必須

説明

table_name

はい

書き込み先の外部テーブルの名前。

select_statement

はい

SELECT 句。ソーステーブルからターゲットテーブルに挿入するデータをクエリします。 ターゲットテーブルに動的パーティションが 1 レベルしかない場合、SELECT 句の最後のフィールドの値がターゲットテーブルの動的パーティション値になります。ソーステーブルの SELECT からの値と出力パーティション値の関係は、列名ではなくフィールドの順序によって決まります。ソーステーブルのフィールド順序がターゲットテーブルと異なる場合は、select_statement のフィールドをターゲットテーブルの順序で指定します。

from_statement

はい

FROM 句。データソースを示します。たとえば、読み取り元の内部テーブルの名前などです。

動的パーティションにデータを挿入するには、「動的パーティションへのデータの挿入または上書き (DYNAMIC PARTITION)」をご参照ください。

注意事項

  • INSERT OVERWRITE ... SELECT ... FROM ...; 操作がソーステーブル from_tablename に 1,000 個のマッパーを割り当てた場合、1,000 個の TSV または CSV ファイルが生成されます。

  • MaxCompute が提供する構成を使用して、生成されるファイルの数を制御できます。

    • 出力がマッパーにある場合:odps.stage.mapper.split.size を使用して同時実行マッパーの数を制御し、生成されるファイルの数を調整します。

    • 出力がレデューサーまたはジョイナーにある場合:それぞれ odps.stage.reducer.numodps.stage.joiner.num を使用して、生成されるファイルの数を調整します。

  • 書き込みの不整合のリスク: OSS 外部テーブルで `INSERT OVERWRITE` 文を使用するか、`UNLOAD` コマンドを使用して OSS にファイルをエクスポートする場合、指定された OSS ロケーションのサブディレクトリまたはパーティションに対応するロケーションのデータは、新しいデータが書き込まれる前に削除されます。ロケーションディレクトリに他の外部エンジンによって直接 OSS に書き込まれた重要なデータが含まれている場合、そのデータも新しいデータが書き込まれる前に削除されます。したがって、外部テーブルのロケーションディレクトリ内の既存のファイルがバックアップされているか、`UNLOAD` ディレクトリが空であることを確認する必要があります。その他の書き込みの不整合のリスクについては、適用範囲をご参照ください。

OSS マルチパートアップロード機能を使用した OSS へのデータ書き込み

オープンソース形式で OSS にデータを書き込む必要がある場合、オープンソースデータパーサーで作成された OSS 外部テーブルと OSS のマルチパートアップロード機能を使用して、INSERT 操作を実行して OSS にデータを書き込むことができます。

OSS マルチパートアップロード機能を有効にするには、次のように設定します。

シナリオ

コマンド

プロジェクトレベルで設定

プロジェクト全体に適用されます。

setproject odps.sql.unstructured.oss.commit.mode =true;

セッションレベルで設定

現在のタスクにのみ適用されます。

set odps.sql.unstructured.oss.commit.mode =true;

odps.sql.unstructured.oss.commit.mode プロパティのデフォルト値は false です。異なる値の実装原則は次のとおりです。

原則

false

MaxCompute が OSS 外部テーブルに書き込んだデータは、LOCATION ディレクトリの下の .odps フォルダに保存されます。.odps フォルダには、MaxCompute のデータ整合性を保証するための .meta ファイルが含まれています。.odps の内容は MaxCompute によってのみ正しく処理できます。他のデータ処理エンジンでは正しく解析できず、エラーが発生する可能性があります。

true

MaxCompute は、他のデータ処理エンジンとの互換性を保つためにマルチパートアップロード機能を使用します。データ整合性を保証するために 2 フェーズコミット方式を使用し、.odps ディレクトリや .meta ファイルは存在しません。

エクスポートされたファイルの管理

パラメーター

OSS に書き込まれるデータファイルにプレフィックス、サフィックス、または拡張子を追加する必要がある場合は、次のパラメーターを使用できます。

property_name

シナリオ

説明

property_value

デフォルト値

odps.external.data.output.prefix

(odps.external.data.prefix と互換)

出力ファイルにカスタムプレフィックスを追加する必要がある場合にこのプロパティを追加します。

  • 数字、文字、アンダースコア (a-z, A-Z, 0-9, _) のみを含みます。

  • 長さは 1~10 文字です。

許可された文字の組み合わせ、例:'mc_'

なし

odps.external.data.enable.extension

出力ファイルの拡張子を表示する必要がある場合にこのプロパティを追加します。

True は出力ファイルの拡張子を表示することを示し、False は表示しないことを示します。

  • True

  • False

False

odps.external.data.output.suffix

出力ファイルにカスタムサフィックスを追加する必要がある場合にこのプロパティを追加します。

数字、文字、アンダースコア (a-z, A-Z, 0-9, _) のみを含みます。

許可された文字の組み合わせ、例:'_hangzhou'

なし

odps.external.data.output.explicit.extension

出力ファイルにカスタム拡張子を追加する必要がある場合にこのプロパティを追加します。

  • 数字、文字、アンダースコア (a-z, A-Z, 0-9, _) のみを含みます。

  • 長さは 1~10 文字です。

  • odps.external.data.enable.extension パラメーターよりも優先度が高いです。

許可された文字の組み合わせ、例:"jsonl"

なし

  1. 出力 OSS ファイルのカスタムプレフィックスを test06_ に設定します。DDL 文は次のとおりです。

    CREATE EXTERNAL TABLE  <mc_oss_extable_name>
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS textfile
    LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/'
    TBLPROPERTIES (
    -- カスタムプレフィックスを設定します。
        'odps.external.data.output.prefix'='test06_') 
    ;
    
    -- 外部テーブルにデータを書き込みます。
    INSERT INTO  <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    次の図は、生成されたファイルを示しています。

    image

  2. 出力 OSS ファイルのカスタムサフィックスを _beijing に設定します。DDL 文は次のとおりです。

    CREATE EXTERNAL TABLE <mc_oss_extable_name>
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS textfile
    LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/'
    TBLPROPERTIES (
    -- カスタムサフィックスを設定します。
        'odps.external.data.output.suffix'='_beijing') 
    ;
    
    -- 外部テーブルにデータを書き込みます。
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    次の図は、生成されたファイルを示しています。

    image

  3. 出力 OSS ファイルに拡張子が自動的に生成されます。DDL 文は次のとおりです。

    CREATE EXTERNAL TABLE <mc_oss_extable_name>
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS textfile
    LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/'
    TBLPROPERTIES (
    -- 拡張子を自動的に生成します。
        'odps.external.data.enable.extension'='true') 
    ;
    
    -- 外部テーブルにデータを書き込みます。
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    次の図は、生成されたファイルを示しています。

  4. 出力 OSS ファイルのカスタム拡張子を jsonl に設定します。DDL 文は次のとおりです。

    CREATE EXTERNAL TABLE <mc_oss_extable_name>
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS textfile
    LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/'
    TBLPROPERTIES (
    -- カスタム拡張子を設定します。
       'odps.external.data.output.explicit.extension'='jsonl') 
    ;
    
    -- 外部テーブルにデータを書き込みます。
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    次の図は、生成されたファイルを示しています。

    image.png

  5. 出力 OSS ファイルのプレフィックスを mc_、サフィックスを _beijing、拡張子を jsonl に設定します。DDL 文は次のとおりです。

    CREATE EXTERNAL TABLE <mc_oss_extable_name>
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS textfile
    LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/'
    TBLPROPERTIES (
        -- カスタムプレフィックスを設定します。
        'odps.external.data.output.prefix'='mc_', 
        -- カスタムサフィックスを設定します。
        'odps.external.data.output.suffix'='_beijing', 
        -- カスタム拡張子を設定します。
        'odps.external.data.output.explicit.extension'='jsonl') 
    ;  
    
    -- 外部テーブルにデータを書き込みます。
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    次の図は、生成されたファイルを示しています。

    image.png

動的パーティションを使用した大容量ファイルの書き込み

ビジネスシナリオ

先祖テーブルの計算結果をパーティションの形式で OSS にエクスポートし、大容量ファイル (例:4 GB) として書き込むことができます。これは、動的パーティション形式で odps.adaptive.shuffle.desired.partition.size パラメーター (MB 単位) を構成することで実現できます。

  • 利点:パラメーター値を構成することで、目的の出力ファイルサイズを制御できます。

  • 欠点:大容量ファイルを書き込むと並列度が低下するため、全体の実行時間が長くなります。

メトリックの説明

-- service.mode はオフにする必要があります。
SET odps.service.mode=off;

-- 動的パーティション機能を有効にする必要があります。
SET odps.sql.reshuffle.dynamicpt=true; 	

-- 各レデューサーの目的のデータ消費量を設定します。各ファイルを 4 GB にしたいと仮定します。
SET odps.adaptive.shuffle.desired.partition.size=4096;	

約 4 GB の JSON ファイルを OSS に書き込みます。

  1. テストデータを準備します。パブリックデータセットテーブル bigdata_public_dataset.tpcds_1t.web_sales を使用します。これは約 30 GB です。データは MaxCompute 上で圧縮形式で保存されているため、エクスポート後にサイズが増加します。

  2. JSON 外部テーブルを作成します。

    -- サンプルテーブル名:json_ext_web_sales
    CREATE EXTERNAL TABLE  json_ext_web_sales(
        c_int INT ,
        c_string STRING 
    )
    PARTITIONED BY (pt STRING)
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    )
    STORED AS textfile
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/demo-test/';
  3. パラメーターを設定せずに、テストテーブルを動的パーティション形式で JSON 外部テーブルに書き込みます。

    -- service.mode はオフにする必要があります。
    set odps.service.mode=off;
    
    -- レイヤー 3 構文スイッチを有効にします。
    SET odps.namespace.schema=true;
    
    -- 動的パーティション形式で JSON 外部テーブルに書き込みます。
    INSERT OVERWRITE json_ext_web_sales 
    PARTITION(pt) 
    SELECT CAST(ws_item_sk AS INT) AS c_int, 
           CAST(ws_bill_customer_sk AS string) AS c_string , 
          COALESCE(CONCAT(ws_bill_addr_sk %2, '_', ws_promo_sk %3),'null_pt') AS pt 
    FROM  bigdata_public_dataset.tpcds_1t.web_sales;

    OSS に保存されているファイルは次の図のようになります。

    image

  4. 大容量ファイル出力のためにパラメーター odps.adaptive.shuffle.desired.partition.size を追加し、テストテーブルを動的パーティション形式で JSON 外部テーブルに書き込みます。

    -- service.mode はオフにする必要があります。
    SET odps.service.mode=off;
    
    -- レイヤー 3 構文スイッチを有効にします。
    SET odps.namespace.schema=true;
    
    -- 動的パーティション機能を有効にする必要があります。
    SET odps.sql.reshuffle.dynamicpt=true; 	
    
    -- 各レデューサーの目的のデータ消費量を設定します。各ファイルを 4 GB にしたいと仮定します。
    SET odps.adaptive.shuffle.desired.partition.size=4096;	
    
    -- 動的パーティション形式で JSON 外部テーブルに書き込みます。
    INSERT OVERWRITE json_ext_web_sales 
    PARTITION(pt) 
    SELECT CAST(ws_item_sk AS INT) AS c_int, 
           CAST(ws_bill_customer_sk AS string) AS c_string , 
          COALESCE(CONCAT(ws_bill_addr_sk %2, '_', ws_promo_sk %3),'null_pt') AS pt 
    FROM  bigdata_public_dataset.tpcds_1t.web_sales;

    OSS に保存されているファイルは次の図のようになります。

    image

OSS へのインポートまたは OSS からのエクスポート

  • LOAD コマンド:OSS などの外部ストレージから MaxCompute テーブルまたはパーティションにデータをインポートします。

  • UNLOAD コマンド:MaxCompute プロジェクトから OSS などの外部ストレージにデータをエクスポートし、他のコンピュートエンジンで使用します。

付録:サンプルデータの準備

  1. OSS ディレクトリの準備

    提供されるサンプルデータ情報は次のとおりです。

    • oss_endpointoss-cn-hangzhou-internal.aliyuncs.com、これは中国 (杭州) です。

    • バケット名oss-mc-test

    • ディレクトリ名Demo1/Demo2/Demo3/、および SampleData/

  2. 非パーティションテーブルデータ

    Demo1/ ディレクトリにアップロードされたファイルは vehicle.csv で、次のデータが含まれています。Demo1/ ディレクトリは、組み込みテキストデータパーサーで作成された非パーティションテーブルにマッピングするために使用されます。

    1,1,51,1,46.81006,-92.08174,9/14/2014 0:00,S
    1,2,13,1,46.81006,-92.08174,9/14/2014 0:00,NE
    1,3,48,1,46.81006,-92.08174,9/14/2014 0:00,NE
    1,4,30,1,46.81006,-92.08174,9/14/2014 0:00,W
    1,5,47,1,46.81006,-92.08174,9/14/2014 0:00,S
    1,6,9,1,46.81006,-92.08174,9/15/2014 0:00,S
    1,7,53,1,46.81006,-92.08174,9/15/2014 0:00,N
    1,8,63,1,46.81006,-92.08174,9/15/2014 0:00,SW
    1,9,4,1,46.81006,-92.08174,9/15/2014 0:00,NE
    1,10,31,1,46.81006,-92.08174,9/15/2014 0:00,N
  3. パーティションテーブルデータ

    Demo2/ ディレクトリには、direction=N/direction=NE/direction=S/direction=SW/direction=W/ の 5 つのサブディレクトリが含まれています。アップロードされたファイルはそれぞれ vehicle1.csv、vehicle2.csv、vehicle3.csv、vehicle4.csv、vehicle5.csv です。これらのファイルには次のデータが含まれています。Demo2/ ディレクトリは、組み込みテキストデータパーサーで作成されたパーティションテーブルにマッピングするために使用されます。

    --vehicle1.csv
    1,7,53,1,46.81006,-92.08174,9/15/2014 0:00
    1,10,31,1,46.81006,-92.08174,9/15/2014 0:00
    
    --vehicle2.csv
    1,2,13,1,46.81006,-92.08174,9/14/2014 0:00
    1,3,48,1,46.81006,-92.08174,9/14/2014 0:00
    1,9,4,1,46.81006,-92.08174,9/15/2014 0:00
    
    --vehicle3.csv
    1,6,9,1,46.81006,-92.08174,9/15/2014 0:00
    1,5,47,1,46.81006,-92.08174,9/14/2014 0:00
    1,6,9,1,46.81006,-92.08174,9/15/2014 0:00
    
    --vehicle4.csv
    1,8,63,1,46.81006,-92.08174,9/15/2014 0:00
    
    --vehicle5.csv
    1,4,30,1,46.81006,-92.08174,9/14/2014 0:00
  4. 圧縮データ

    Demo3/ ディレクトリにアップロードされたファイルは vehicle.csv.gz です。圧縮パッケージ内のファイルは vehicle.csv で、Demo1/ ディレクトリのファイルと同じ内容です。これは、圧縮プロパティを持つ OSS 外部テーブルにマッピングするために使用されます。

  5. カスタムパーサーデータ

    SampleData/ ディレクトリにアップロードされたファイルは vehicle6.csv で、次のデータが含まれています。SampleData/ ディレクトリは、オープンソースデータパーサーで作成された OSS 外部テーブルにマッピングするために使用されます。

    1|1|51|1|46.81006|-92.08174|9/14/2014 0:00|S
    1|2|13|1|46.81006|-92.08174|9/14/2014 0:00|NE
    1|3|48|1|46.81006|-92.08174|9/14/2014 0:00|NE
    1|4|30|1|46.81006|-92.08174|9/14/2014 0:00|W
    1|5|47|1|46.81006|-92.08174|9/14/2014 0:00|S
    1|6|9|1|46.81006|-92.08174|9/14/2014 0:00|S
    1|7|53|1|46.81006|-92.08174|9/14/2014 0:00|N
    1|8|63|1|46.81006|-92.08174|9/14/2014 0:00|SW
    1|9|4|1|46.81006|-92.08174|9/14/2014 0:00|NE
    1|10|31|1|46.81006|-92.08174|9/14/2014 0:00|N

よくある質問

外部テーブルを使用して OSS データを処理する際に「Inline data exceeds the maximum allowed size」エラーを解決するにはどうすればよいですか?

  • 問題

    OSS データを処理する際に、Inline data exceeds the maximum allowed size というエラーが報告されます。

  • 原因

    OSS Store には各小規模ファイルのサイズ制限があります。ファイルが 3 GB を超えるとエラーが報告されます。

  • 解決策

    この問題を解決するには、次の 2 つのプロパティを調整します。原則として、プロパティ値を変更して実行計画を調整し、各レデューサーが OSS 外部テーブルに書き込むデータのサイズを制御します。これにより、OSS Store ファイルが 3 GB の制限を超えないようにします。

    set odps.sql.mapper.split.size=256; # 各マッパーが読み取るデータサイズを調整します (MB 単位)。
    set odps.stage.reducer.num=100; # reduce ステージのワーカー数を調整します。

MaxCompute 上で OSS 外部テーブルにアクセスする UDF をアップロードした後、ローカルテストは合格したにもかかわらずメモリオーバーフローエラーが発生する場合、どうすれば解決できますか?

  • 問題

    MaxCompute 上で 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;       
  • 原因

    外部テーブルにオブジェクトファイルが多すぎてメモリ使用量が過剰になり、パーティションが設定されていません。

  • 解決策

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

    • オブジェクトファイルをパーティション分割してメモリ使用量を削減します。

OSS 外部テーブルを使用して複数の小規模ファイルを単一ファイルにマージするにはどうすればよいですか?

Logview ログを確認して、SQL 実行計画の最終ステージがレデューサーかジョイナーかを確認します。

  • レデューサーの場合、set odps.stage.reducer.num=1; という文を実行します。

  • ジョイナーの場合、set odps.stage.joiner.num=1; という文を実行します。

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 外部テーブル作成ステートメントの oss_location パラメーターの oss_endpoint が内部エンドポイントであるか確認します。パブリックエンドポイントの場合は、内部エンドポイントに変更します。パラメーターの詳細については、「パラメーター」をご参照ください。

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

    • 原因 2 の場合:

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

OSS 外部テーブル作成時に「Network is unreachable (connect failed)」エラーを解決するにはどうすればよいですか?

  • 問題

    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 外部テーブル作成ステートメントの oss_location パラメーターの oss_endpoint が内部エンドポイントであるか確認します。パブリックエンドポイントの場合は、内部エンドポイントに変更します。パラメーターの詳細については、「パラメーター」をご参照ください。

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

OSS 外部テーブルでの SQL ジョブ実行が遅い問題を解決するにはどうすればよいですか?

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

    • 症状

      ユーザーが OSS 内の 200 GB の GZ 圧縮ファイルをデータソースとする OSS 外部テーブルを作成しました。データ読み取りプロセスが遅いです。

    • 原因

      map ステージで計算を実行しているマッパーが少なすぎるため、SQL 処理速度が遅くなっています。

    • 解決策

      • 構造化データの場合、次のパラメーターを設定して、単一のマッパーが読み取るデータ量を調整し、SQL 実行を高速化できます。

        set odps.sql.mapper.split.size=256; # 各マッパーが読み取るテーブルデータサイズを調整します (MB 単位)。       
      • 非構造化データの場合、OSS 外部テーブルパスに OSS ファイルが 1 つしかないか確認します。1 つしかない場合、圧縮形式の非構造化データは分割できないため、マッパーは 1 つしか生成されません。これにより、処理速度が遅くなります。大きな OSS ファイルを、OSS 上の対応する外部テーブルパス内の小さなファイルに分割することをお勧めします。これにより、外部テーブルが読み取られるときに生成されるマッパーの数が増え、読み取り速度が向上します。

  • SDK を使用した MaxCompute 外部テーブルデータの検索が遅い

    • 症状

      SDK を使用して MaxCompute 外部テーブルデータを検索するのが遅いです。

    • 解決策

      外部テーブルはフルテーブルスキャンのみをサポートしており、これは遅いです。代わりに MaxCompute 内部テーブルを使用することをお勧めします。

OSS マルチパートアップロード機能を使用しているときに、古いデータは削除されるが新しいデータが書き込まれない問題を解決するにはどうすればよいですか?

  • 問題

    insert overwrite シナリオで、極端な場合にジョブが失敗すると、結果が期待と一致しないことがあります。古いデータは削除されますが、新しいデータは書き込まれません。

  • 原因

    ハードウェアの障害やメタデータ更新の失敗という非常に低い確率で、新しく書き込まれたデータがターゲットテーブルに書き込まれないことがあります。OSS の削除操作はロールバックをサポートしていないため、削除された古いデータは回復できません。

  • 解決策

    • 古いデータに基づいて OSS 外部テーブルを上書きする場合、たとえば insert overwrite table T select * from table T; のように、事前に OSS データをバックアップします。ジョブが失敗した場合、バックアップした古いデータに基づいて OSS 外部テーブルを上書きできます。

    • insert overwrite ジョブが再送信可能な場合は、ジョブが失敗した場合に単に再送信します。

Spark から OSS 外部テーブルにアクセスする際の「table not found」エラーの解決策

  • 問題

    Spark を使用して OSS 外部テーブルにアクセスすると、タスクが「table not found」エラーで失敗します

  • 解決策

    • 次のパラメーターを追加します。

      • 外部テーブル構成を有効にする:spark.sql.catalog.odps.enableExternalTable=true;

      • OSS が配置されているリージョンを構成する:spark.hadoop.odps.oss.region.default=cn-<region>

    • 上記のパラメーターを追加してもエラーが解決しない場合は、以下のようにします。

      image

      OSS 外部テーブルを再作成してから、再度アクセスします。

関連ドキュメント