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

MaxCompute:ORC 外部テーブル

最終更新日:Sep 19, 2026

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

制限事項

権限の説明

  • OSS 外部テーブルにアクセスする際、Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールのいずれを使用しているかに関わらず、データは odps.properties.rolearn パラメーターで指定されたロールを通じてアクセスされます。したがって、RAM ロールを作成し、対象の OSS バケットへのアクセス権限を付与した後、そのロールの ARN を odps.properties.rolearn パラメーターに設定する必要があります。詳細については、「パラメーター」をご参照ください。

  • ビジネス要件に応じて、同一アカウントまたはクロスアカウントのアクセスを許可できます。よりきめ細かなアクセス制御を行うには、カスタム権限付与ポリシーを使用することを推奨します。詳細については、「外部データソースの権限付与」をご参照ください。

外部テーブルの作成

構文

ORC ファイルのスキーマと外部テーブルのスキーマが一致しない場合、MaxCompute は次のように差異を処理します:

  • ファイルのカラム数がテーブルのカラム数より少ない場合:不足しているカラムは NULL で埋められます。

  • ファイルのカラム数がテーブルのカラム数より多い場合:余分なカラムは破棄されます。

  • 型が不一致の場合:STRING は ORC ファイルから INT データを読み取ることができますが、これは推奨されません。INT が STRING データを読み取る場合、非数値は NULL に変換され、数値は受け入れられます。

簡易構文または完全な構文のいずれかを使用して、ORC 外部テーブルを作成します。

簡易構文 (推奨)

MaxCompute にデフォルトの RAM ロールを使用して権限を自動的に処理させる場合は、この構文を使用します。

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/<role_name>'
)
STORED AS orc
LOCATION '<oss_location>'
tblproperties (
    '<xxx>'='<yyy>'
);

共通パラメーター

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

フォーマット固有のパラメーター

WITH serdeproperties

プロパティ

使用する状況

デフォルト

mcfed.orc.schema.resolution

同一の外部テーブル内の ORC ファイルのスキーマに一貫性がない場合。

name — カラムを名前でマッピングします。

position — カラムを位置でマッピングします。

tblproperties

プロパティ

使用する状況

説明

デフォルト

mcfed.orc.compress

圧縮形式で ORC データを OSS に書き込む場合。

圧縮ファイルを読み取る際に、追加のパラメーター設定は不要です。

ORC 出力ファイルの圧縮アルゴリズム。

SNAPPYZLIB、または ZSTD

なし

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

出力ファイルにカスタムサフィックスを追加する場合。

サフィックス文字列。使用可能な文字:英字、数字、アンダースコア。

例:_hangzhou

なし

odps.external.data.output.explicit.extension

出力ファイルにカスタム拡張子を追加する場合。odps.external.data.enable.extension よりも優先されます。

拡張子文字列。使用可能な文字:英字、数字、アンダースコア。長さ:1~10 文字。

例:jsonl

なし

odps.ext.column.mapping

OSS データファイルのフィールド名に特殊文字が含まれている場合、このプロパティを追加します。

このプロパティは、カスタムカラム名マッピングを定義します。たとえば、OSS ファイルのフィールドが id BIGINT$_test DOUBLE=name STRING の場合、外部テーブルの作成時にパラメーター値を t_test:$_test,t_name:'=name' に設定します。特殊文字を含むフィールドのマッピングのみを指定する必要があります。

固定値なし

なし

odps.ext.column.mapping.delimiters

(カラム名内の文字がカラム名マッピングのデフォルトのデリミタと競合する場合にのみ使用します。通常は推奨されません。)

カラム名に特殊文字 : または , が含まれている場合、このプロパティを追加します。

このプロパティは、キーと値のペアのグループ内およびグループ間のデリミタをカスタマイズします。値には正確に 2 文字を含める必要があります。最初の文字がキーと値のデリミタとして使用され、2 番目の文字が異なるキーと値のペア間のデリミタとして使用されます。

固定値なし。例:=|

デフォルト値:':,'

  • デフォルトでは、':' がキーと値の間のデリミタとして使用されます。

  • コンマ ',' が異なるキーと値のペア間のデリミタとして使用されます。

  • キーと値の先頭と末尾のスペースは、解析中にトリミングされます。

mcfed.orc.batch.size

メモリ使用量と処理スループットを調整する場合。

バッチごとに処理される行数 (ORC バッチサイズ)。

非負整数

1000

ホワイトリストとブラックリスト

MaxCompute の OSS 外部テーブルは、ホワイトリストとブラックリストによるフィルタリングをサポートしています。tblproperties でホワイトリストとブラックリストのパラメーターを設定することで、ディレクトリから読み取るファイルをフィルタリングできます。詳細については、「ホワイトリストとブラックリスト」をご参照ください。

データの書き込み

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

データのクエリ

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

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

  • 述語プッシュダウンの有効化

    述語プッシュダウン (PPD) は、フィルタリング条件をデータスキャンレイヤーにプッシュダウンすることで、ORC 外部テーブルのクエリパフォーマンスを向上させます。PPD にはネイティブモード (odps.ext.oss.orc.native=true) が必要です。

    SQL クエリの前に、次のステートメントを追加します:

    -- ORC ネイティブリーダーを有効化
    SET odps.ext.oss.orc.native=true;
    
    -- ORC 述語プッシュダウンを有効化
    SET odps.storage.orc.use.predicate.pushdown=true;

この例では、SNAPPY 圧縮を使用した ORC 外部テーブルを作成し、既存のパーティションを追加し、データを読み取り、新しい行を書き込みます。

前提条件

  1. MaxCompute プロジェクトを作成しておく必要があります。

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

    バケットが MaxCompute プロジェクトと同じリージョンにあることを確認してください。
  3. 権限の付与

    1. OSS にアクセスする権限が必要です。OSS 外部テーブルには、Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールを使用してアクセスできます。権限付与方法の詳細は、「OSS の STS モード認証」をご参照ください。

    2. MaxCompute プロジェクトで CreateTable 権限が必要です。テーブル関連の権限の詳細は、「MaxCompute 権限」をご参照ください。

ステップ 1:データファイルの準備

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

ステップ 2:外部テーブルの作成

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/<role_name>'
)
STORED AS ORC
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/orc_snappy/'
tblproperties (
    'mcfed.orc.compress'='SNAPPY'
);

ステップ 3:既存のパーティションの追加

パーティション化された外部テーブルの場合、MSCK REPAIR TABLE を実行して、既存の OSS パーティションを MaxCompute に登録します。完全な構文については、「OSS 外部テーブルへのパーティションの追加」をご参照ください。

MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;

ステップ 4:データの読み取り

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   |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+

ステップ 5:データの書き込み

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」をご参照ください。

MaxCompute は、ORC 外部テーブルを読み取るための 2 つのモードをサポートしています:

  • JNI モード (SET odps.ext.oss.orc.native=false;):読み取りと書き込みの両方の操作をサポートします。

  • ネイティブモード (SET odps.ext.oss.orc.native=true;):読み取り操作のみをサポートします。

データ型

JNI モード (読み取りおよび書き込み)

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

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

いいえ

いいえ

サポートされている圧縮形式

圧縮された ORC ファイルを読み書きするには、テーブル作成時に tblproperties セクションで mcfed.orc.compress プロパティを設定します。詳細については、「tblproperties」をご参照ください。

圧縮プロパティ

読み取り

書き込み

ZSTD

はい

はい

SNAPPY (SnappyRawCodec)

はい

はい

SNAPPY (SnappyCodec)

はい

いいえ

ZLIB

はい

はい

サポートされているスキーマエボリューション

ORC 外部テーブルは、テーブルカラムを ORC ファイルフィールドにマッピングするための 2 つの方式をサポートしています:位置ベースのマッピングと名前ベースのマッピングです。

  • 位置ベースのマッピング (デフォルト):'mcfed.orc.schema.resolution'='position' を設定するか、プロパティを省略します。カラムは順序に基づいて照合されるため、テーブルのカラムの順序は ORC ファイル内のフィールドの順序と完全に一致する必要があります。

  • 名前ベースのマッピング'mcfed.orc.schema.resolution'='name' を設定します。カラムは順序に関係なく、名前によって照合されます。

説明

以下の表は、各マッピング方式と互換性のあるスキーマ変更操作を示しています。「互換性あり」とは、操作後に新しく書き込まれたデータと履歴データの両方を正しく読み取れることを意味します。

スキーマ変更

マッピングモード

サポート

説明

データ互換性

カラムの追加

位置ベース

はい

  • 新しいカラムは末尾に追加されます。位置は指定できません。

  • 追加されたカラムのデフォルト値は、変更後に MaxCompute によって書き込まれたデータにのみ適用されます。

  • 更新されたスキーマに一致する新しいデータは正常に読み取ることができます。

  • 変更前に書き込まれた履歴データは、新しいスキーマを使用して読み取られます。

たとえば、カラムが追加された後、その新しいカラムがない履歴行では、そのカラムに対して NULL が返されます。

名前ベース

はい

カラムの削除

位置ベース

いいえ

非推奨です。位置ベースのマッピングでは、DDL のカラム順序がファイルと一致する必要があります。カラムが削除されると、DDL とファイルのスキーマが異なり、読み取りエラーが発生します。

  • 更新されたスキーマに一致する新しいデータは正常に読み取ることができます。

  • 変更前に書き込まれた履歴データは、新しいスキーマを使用して読み取られます。

たとえば、カラムが削除された後、削除されたカラムがまだ含まれている履歴データは、読み取りエラーを引き起こします。

名前ベース

はい

名前ベースのマッピングは、カラムの順序に関係なく、名前でカラムを照合します。

互換性あり

カラム順序の変更

位置ベース

いいえ

非推奨です。位置ベースのマッピングでは、DDL のカラム順序がファイルと一致する必要があります。カラムが並べ替えられると、DDL とファイルのスキーマが異なり、読み取りエラーが発生します。

  • 更新されたスキーマに一致する新しいデータは正常に読み取ることができます。

  • 変更前に書き込まれた履歴データは、新しいスキーマを使用して読み取られます。

たとえば、カラムが並べ替えられた後、履歴データは元の順序を保持するため、スキーマとデータの不整合が発生します。

名前ベース

はい

名前ベースのマッピングは、カラムの順序に関係なく、名前でカラムを照合します。

互換性あり

カラムデータ型の変更

位置ベース

はい

許可される型変換については、「カラムデータ型の変更」をご参照ください。

互換性あり

名前ベース

はい

カラム名の変更

位置ベース

はい

互換性あり

名前ベース

いいえ

非推奨です。名前ベースのマッピングは、名前でカラムを照合します。カラムの名前が変更されると、元の名前を使用している既存のファイルは照合できなくなります。

  • 更新されたスキーマに一致する新しいデータは正常に読み取ることができます。

  • 変更前に書き込まれた履歴データは、新しいスキーマを使用して読み取られます。

たとえば、カラムの名前が変更された後、ORC ファイルのスキーマがまだ元の名前を使用している場合、読み取り時にそのカラムは NULL を返します。

カラムコメントの変更

位置ベース

はい

コメントは 1,024 バイト以下の有効な文字列である必要があります。

互換性あり

名前ベース

はい

カラムの Null 許容属性の変更

位置ベース

いいえ

カラムはデフォルトで Null を許容します。

適用外

名前ベース

いいえ