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

MaxCompute:ORC 外部テーブル

最終更新日:Feb 07, 2026

このトピックでは、ORC フォーマットの OSS 外部テーブルを作成、読み取り、書き込みする方法について説明します。

適用範囲

外部テーブルの作成

構文

ORC ファイルのスキーマが外部テーブルのスキーマと一致しない場合:

  • 列数が一致しない場合: ORC ファイルの列数が外部テーブルより少ない場合、データの読み取り時に不足している列は NULL 値で補完されます。ファイルの列数が多い場合、余分な列は破棄されます。

  • 列の型が一致しない場合: MaxCompute は、STRING 型を使用して ORC ファイルから INT データを読み取ることをサポートしていますが、これは推奨されません。INT 型を使用して STRING データを読み取る場合、システムは文字列値を NULL に変換し、数値のみを受け入れます。

簡易構文

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
  <col_name> <data_type>,
  ...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
STORED AS orc
LOCATION '<oss_location>';

完全な構文

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 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
WITH serdeproperties(
    'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
)
STORED AS orc 
LOCATION '<oss_location>' 
tblproperties (
    '<xxx>'='<yyy>'
);

共通パラメーター

共通パラメーターの詳細については、「基本的な構文パラメーター」をご参照ください。

固有パラメーター

with serdeproperties のプロパティ

プロパティ名

シナリオ

説明

プロパティ値

デフォルト値

mcfed.orc.schema.resolution

同じ OSS 外部テーブル内のデータのスキーマが一致しない場合にこのプロパティを追加します。

ORC ファイルの解析メソッドを設定します。name は列名による解析を示します。

name

デフォルトでは列番号で解析します。

以下と同等です: 'mcfed.orc.schema.resolution'='position'

tblproperties のプロパティ

プロパティ名

シナリオ

説明

プロパティ値

デフォルト値

mcfed.orc.compress

圧縮フォーマットで ORC データを OSS に書き込む場合にこのプロパティを追加します。

ORC 圧縮プロパティ。ORC データの圧縮メソッドを指定します。

  • SNAPPY

  • ZLIB

None

io.compression.codecs

OSS データファイルが Raw-Snappy フォーマットの場合にこのプロパティを追加します。

このパラメーターを True に設定すると、MaxCompute は圧縮データを正常に読み取ることができます。それ以外の場合、MaxCompute はデータを読み取れません。

com.aliyun.odps.io.compress.SnappyRawCodec

None

odps.external.data.output.prefix

(odps.external.data.prefix と互換性あり)

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

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

  • 長さは 1 から 10 の間です。

有効な文字の組み合わせ (例: 'mc_')。

None

odps.external.data.enable.extension

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

True は出力ファイルの拡張子を表示し、False は非表示にします。

  • True

  • False

False

odps.external.data.output.suffix

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

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

有効な文字の組み合わせ (例: '_hangzhou')。

None

odps.external.data.output.explicit.extension

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

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

  • 長さは 1 から 10 の間です。

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

有効な文字の組み合わせ (例: "jsonl")。

None

mcfed.orc.batch.size

一度に処理されるレコード数を制御し、メモリ使用量と処理効率に影響します。

ORC チューニングプロパティ。デフォルトの ORC バッチサイズを行数で定義します。

非負整数

1000

データの書き込み

MaxCompute の書き込み構文の詳細については、「書き込み構文」をご参照ください。

クエリ分析

  • SELECT 構文の詳細については、「クエリ構文」をご参照ください。

  • クエリプランの最適化の詳細については、「クエリの最適化」をご参照ください。

  • 述語プッシュダウン (PPD) を有効にすることで、ORC 外部テーブルに対するクエリを最適化できます。そのためには、SQL 文の前に次のパラメーターを追加します:

    PPD パラメーターはネイティブモードで使用する必要があります。つまり、ネイティブスイッチを true に設定する必要があります。

    -- ORC ネイティブリーダーを有効にします。
    SET odps.ext.oss.orc.native-true;
    
    -- ORC PPD を有効にします。
    SET odps.storage.orc.use.predicate.pushdown=true; 

シナリオ例

この例では、SNAPPY 圧縮を使用する ORC 外部テーブルを作成し、そのテーブルからデータを読み書きする方法を示します。

  1. 前提条件

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

    2. OSS バケットと OSS ディレクトリを準備済みであること。詳細については、「バケットの作成」および「フォルダの管理」をご参照ください。

      MaxCompute は特定のリージョンでのみ利用可能なため、リージョン間の接続性の問題が発生する可能性があります。ご利用の MaxCompute プロジェクトと同じリージョンにある OSS バケットを使用することを推奨します。
    3. 権限付与

      1. OSS にアクセスする権限を持っていること。Alibaba Cloud アカウント (プライマリアカウント)、Resource Access Management (RAM) ユーザー、または RAM ロールは、OSS 外部テーブルにアクセスできます。権限付与の詳細については、「OSS の STS モードでの権限付与」をご参照ください。

      2. MaxCompute プロジェクトで CreateTable 権限を持っていること。テーブル操作の権限の詳細については、「MaxCompute の権限」をご参照ください。

  2. SNAPPY フォーマットのデータファイルを準備します。

    提供されているサンプルデータを使用して、oss-mc-test バケットにフォルダパス orc_snappy/dt=20250526 を作成します。SNAPPY ファイルdt=20250526 パーティションフォルダにアップロードします。

  3. SNAPPY 圧縮を使用する ORC 外部テーブルを作成します。

    CREATE EXTERNAL TABLE orc_data_type_snappy
    (
        vehicleId INT,
        recordId INT,
        patientId INT,
        calls INT,
        locationLatitute DOUBLE,
        locationLongitude DOUBLE,
        recordTime STRING,
        direction STRING
    )
    PARTITIONED BY (dt STRING )
    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
    WITH serdeproperties (
     'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS ORC  
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/orc_snappy/'
    tblproperties (
        'mcfed.orc.compress'='SNAPPY');
  4. OSS 外部テーブルがパーティション化されている場合は、次のコマンドを実行して既存のパーティションを追加します。詳細については、「OSS 外部テーブルにパーティションを追加する構文」をご参照ください。

    -- 外部テーブルにパーティションを追加します
    MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;
  5. ORC 外部テーブルからデータを読み取ります。

    SELECT * FROM orc_data_type_snappy WHERE dt=20250526 LIMIT 10;

    クエリは次の結果を返します:

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongitude | recordtime     | direction  | dt         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
    | 1          | 12         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | SW         | 20250526   |
    | 1          | 1          | 51         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:00 | S          | 20250526   |
    | 1          | 2          | 13         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:01 | NE         | 20250526   |
    | 1          | 3          | 48         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:02 | NE         | 20250526   |
    | 1          | 4          | 30         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:03 | W          | 20250526   |
    | 1          | 5          | 47         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:04 | S          | 20250526   |
    | 1          | 6          | 9          | 1          | 46.81006         | -92.08174         | 9/14/2014 0:05 | S          | 20250526   |
    | 1          | 7          | 53         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:06 | N          | 20250526   |
    | 1          | 8          | 63         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:07 | SW         | 20250526   |
    | 1          | 9          | 4          | 1          | 46.81006         | -92.08174         | 9/14/2014 0:08 | NE         | 20250526   |
    | 1          | 10         | 31         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:09 | N          | 20250526   |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
  6. ORC 外部テーブルにデータを書き込み、そのデータをクエリします。

    INSERT INTO orc_data_type_snappy PARTITION (dt ='20250526') 
      VALUES (1,16,76,1,46.81006,-92.08174,'9/14/2014 0:10','SW');
    
    -- 新しく挿入されたデータをクエリします
    SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' AND recordid=16;

    クエリは次の結果を返します:

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongitude | recordtime     | direction  | dt         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
    | 1          | 16         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | SW         | 20250526   |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+

サポートされているデータ型

MaxCompute のデータ型の詳細については、「データ型バージョン 1.0」および「データ型バージョン 2.0」をご参照ください。

  • JNI モード (set odps.ext.oss.orc.native=false;): このモードでは、テーブル読み取り時にネイティブ ORC リーダーを使用しません。読み取りと書き込みの両方の操作をサポートします。

  • ネイティブモード (set odps.ext.oss.orc.native=true;): このモードでは、テーブル読み取り時にネイティブ ORC リーダーを使用します。読み取り操作のみをサポートします。

モード

Java モード (読み取りと書き込み)

ネイティブモード (読み取り専用)

TINYINT

サポートされています

サポートされています

SMALLINT

サポートされています

サポートされています

INT

サポートされています

サポートされています

BIGINT

サポートされています

サポートされています

BINARY

サポートされています

サポートされています

FLOAT

サポートされています

サポートされています

DOUBLE

サポートされています

サポートされています

DECIMAL(precision,scale)

サポートされています

サポートされています

VARCHAR(n)

サポートされています

サポートされています

CHAR(n)

サポートされています

サポートされています

STRING

サポートされています

サポートされています

DATE

サポートされています

サポートされています

DATETIME

サポートされていません

サポートされています

TIMESTAMP

サポートされていません

サポートされていません

TIMESTAMP_NTZ

サポートされています

サポートされていません

BOOLEAN

サポートされています

サポートされています

ARRAY

サポートされています

サポートされています

MAP

サポートされています

サポートされています

STRUCT

サポートされています

サポートされています

JSON

サポートされていません

サポートされていません

サポートされている圧縮フォーマット

  • 圧縮された OSS ファイルを読み書きするには、テーブル作成文に with serdeproperties 構成を追加する必要があります。詳細については、「with serdeproperties のプロパティパラメーター」をご参照ください。

  • MaxCompute は、SNAPPY または ZLIB で圧縮された ORC ファイルの読み書きをサポートしています。

スキーマエボリューションのサポート

ORC 外部テーブルは、テーブルスキーマをデータファイル内の列にマッピングするために、位置ベースのマッピングと名前ベースのマッピングの 2 つのメソッドをサポートしています。

  • 位置ベースのマッピング: このメソッドを使用するには、'mcfed.orc.schema.resolution'='position' パラメーターを設定するか、省略してデフォルト設定を使用します。システムは位置に基づいて列をマッピングします。したがって、テーブルの列の順序は、ファイル内のフィールドの順序と完全に一致する必要があります。

  • 名前ベースのマッピング: このメソッドを使用するには、外部テーブルの作成時に 'mcfed.orc.schema.resolution'='name' パラメーターを設定します。これにより、システムは位置ではなく名前で列をマッピングします。

次の表のデータ互換性の問題では、スキーマエボリューション操作後に外部テーブルがデータを正しく読み取れるかどうかを説明します。これには、変更されたスキーマに準拠する新しいデータと、古いスキーマを使用する既存データの読み取りが含まれます。

操作タイプ

マッピングメソッド

サポート

説明

データ互換性の問題

列の追加

位置ベースのマッピング

サポートされています

  • 新しい列は指定した順序で追加できず、デフォルトで最後の列として追加されます。

  • デフォルト値を持つ通常の列を追加しても、MaxCompute から書き込まれたデータにのみ有効です。

  • 変更されたスキーマ構造に準拠するデータは正しく読み取ることができます。

  • 列の変更操作が行われなかった古いスキーマの既存データは、新しいスキーマを使用してテーブルによって読み取られます。

    たとえば、テーブルに列が追加されたが、対応する列が既存データに追加されていない場合、テーブルを読み取るときにその列の既存データは NULL で埋められます。

名前ベースのマッピング

サポートされています

列の削除

位置ベースのマッピング

サポートされていません

非推奨。ORC 外部テーブルは位置によって列の値をマッピングします。テーブルの列の順序は、ファイル内のフィールドの順序と一致する必要があります。列の削除操作後、ファイルとテーブルのフィールドが一致しない場合、テーブルの読み取り時にエラーが発生します。

  • 変更されたスキーマ構造に準拠するデータは正しく読み取ることができます。

  • 列の変更操作が行われなかった古いスキーマの既存データは、新しいスキーマを使用してテーブルによって読み取られます。

    たとえば、テーブルから列が削除されたが、対応する列が既存データから削除されていない場合、テーブルの読み取り時にエラーが発生します。

名前ベースのマッピング

サポートされています

名前ベースのマッピングでは、システムは列名に基づいて自動的に照合するため、順序に依存しなくなります。

互換性あり

列の順序変更

位置ベースのマッピング

サポートされていません

非推奨。ORC 外部テーブルは位置によって列の値をマッピングします。テーブルの列の順序は、ファイル内のフィールドの順序と一致する必要があります。列の削除操作後、ファイルとテーブルのフィールドが一致しない場合、テーブルの読み取り時にエラーが発生します。

  • 変更されたスキーマ構造に準拠するデータは正しく読み取ることができます。

  • 列の変更操作が行われなかった古いスキーマの既存データは、新しいスキーマを使用してテーブルによって読み取られます。

    たとえば、テーブルの列の順序が変更されたが、既存データの列の順序が変更されていない場合、スキーマとデータが対応しなくなります。

名前ベースのマッピング

サポートされています

名前ベースのマッピングでは、システムは列名に基づいて自動的に照合するため、順序に依存しなくなります。

互換性あり

列のデータ型変更

位置ベースのマッピング

サポートされています

データ型の変換テーブルの詳細については、「列のデータ型変更」をご参照ください。

互換性あり

名前ベースのマッピング

サポートされています

列名の変更

位置ベースのマッピング

サポートされています

互換性あり

名前ベースのマッピング

サポートされていません

非推奨。名前ベースのマッピングでは、システムは列名に基づいて自動的に照合します。列名を変更すると、一致する可能性があった元の列名がファイル内で見つからなくなる可能性があります。

  • 変更されたスキーマ構造に準拠するデータは正しく読み取ることができます。

  • 既存データに対して列の変更操作を行わない場合、テーブルは新しいスキーマを使用して読み取られます。

    たとえば、テーブルで列名が変更されたが、ORC ファイルスキーマで対応する列名が変更されていない場合、テーブルを読み取るときにその列は空になります。

列コメントの変更

位置ベースのマッピング

サポートされています

コメントの内容は、長さが 1024 バイトを超えない有効な文字列である必要があります。それ以外の場合はエラーが報告されます。

互換性あり

名前ベースのマッピング

サポートされています

列の NULL 値許容プロパティの変更

位置ベースのマッピング

サポートされていません

この操作はサポートされていません。デフォルトで NULL 値を許容します。

該当なし

名前ベースのマッピング

サポートされていません