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

MaxCompute:ORC 外部テーブル

最終更新日:Jan 01, 2026

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

適用範囲

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

  • 単一ファイルのサイズは 2 GB を超えることはできません。ファイルが大きすぎる場合は、分割してください。

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

サポートされるデータの型

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

  • Java Native Interface (JNI) モード (ネイティブ ORC リーダーを使用してテーブルを読み取らない場合): set odps.ext.oss.orc.native=false;。読み取りと書き込みの両方の操作がサポートされています。

  • ネイティブモード (ネイティブ ORC リーダーを使用してテーブルを読み取る場合): set odps.ext.oss.orc.native=true;。読み取り操作のみがサポートされています。

パターン

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 ファイルの読み取りまたは書き込みを行うには、CREATE TABLE 文に with serdeproperties プロパティを追加する必要があります。詳細については、「WITH SERDEPROPERTIES のパラメーター」をご参照ください。

  • SNAPPY または ZLIB を使用して圧縮された ORC ファイルの読み取りと書き込みができます。

外部テーブルの作成

構文

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

  • 列数が一致しない場合: ORC ファイルの列数がデータ定義言語 (DDL) 文で定義された外部テーブルよりも少ない場合、MaxCompute はデータの読み取り時に不足している列を NULL 値で埋めます。ORC ファイルの列数が多い場合、余分な列は破棄されます。

  • 列の型が一致しない場合: MaxCompute では、ORC ファイルから INT データを STRING 型として読み取ることができますが、この方法は推奨されません。STRING データを INT 型として読み取ろうとすると、文字列値は 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 フォーマットの場合、このプロパティを追加します。

このパラメーターを設定すると、MaxCompute は圧縮データを読み取ることができます。そうでない場合、読み取り操作は失敗します。

com.aliyun.odps.io.compress.SnappyRawCodec

None

odps.external.data.output.prefix

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

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

  • プレフィックスには、数字、文字、アンダースコア (_) のみを含めることができます。

  • 長さは 1~10 文字である必要があります。

'mc_' のような有効な文字列。

None

odps.external.data.enable.extension

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

このプロパティを True に設定すると、ファイル拡張子が表示されます。そうでない場合、ファイル拡張子は表示されません。

  • True

  • False

False

odps.external.data.output.suffix

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

サフィックスには、数字、文字、アンダースコア (_) のみを含めることができます。

'_hangzhou' のような有効な文字列。

None

odps.external.data.output.explicit.extension

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

  • 拡張子には、数字、文字、アンダースコア (_) のみを含めることができます。

  • 長さは 1~10 文字である必要があります。

  • このプロパティは odps.external.data.enable.extension プロパティよりも優先度が高いです。

"jsonl" のような有効な文字列。

None

mcfed.orc.batch.size

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

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

負でない整数

1000

データ書き込み

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

クエリと分析

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

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

  • ORC 外部テーブルは、述語プッシュダウン (PPD) を有効にすることでクエリの最適化をサポートします。PPD を有効にするには、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 バケットとフォルダを準備します。詳細については、「バケットの作成」および「フォルダの管理」をご参照ください。

      MaxCompute は一部のリージョンにのみデプロイされています。データ接続性の問題を回避するため、MaxCompute プロジェクトと同じリージョンにある OSS バケットを使用してください。
    3. 権限付与

      1. OSS にアクセスするための権限が必要です。Alibaba Cloud アカウント、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   |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+