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

MaxCompute:ORC 外部テーブル

最終更新日:Aug 27, 2025

このトピックでは、OSS に格納されている ORC 形式の外部テーブルの作成、読み取り、および書き込み方法について説明します。

前提条件

  • Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールが OSS 外部テーブルにアクセスするために必要な権限を持っていることを確認します。 権限付与の詳細については、「OSS の STS 権限付与」をご参照ください。

  • (オプション) OSS バケット、ディレクトリ、およびデータファイルを準備します。 詳細については、「バケットの作成」、「ディレクトリの管理」、および「シンプルアップロード」をご参照ください。

    MaxCompute は OSS のディレクトリを自動的に作成できます。 1 つの SQL 文を使用して、UDF を使用する外部テーブルからデータを読み書きできます。 ディレクトリの手動作成は不要になりましたが、従来の方法は引き続きサポートされています。
  • MaxCompute プロジェクトが作成されています。 詳細については、「MaxCompute プロジェクトの作成」をご参照ください。

    MaxCompute は特定のリージョンにのみデプロイされています。 リージョン間のデータ接続の問題を防ぐため、MaxCompute プロジェクトと同じリージョンのバケットを使用することをお勧めします。
  • Alibaba Cloud アカウントまたは RAM ユーザーは、プロジェクトに対する CreateTable 権限を持っています。 テーブル操作権限の詳細については、「MaxCompute の権限」をご参照ください。

制限事項

  • cluster 属性は OSS 外部テーブルではサポートされていません。

  • 単一ファイルは 3 GB を超えることはできません。 ファイルがこの制限を超える場合は、分割することをお勧めします。

注意事項

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

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

  • 列の型が一致しない: MaxCompute では、ORC ファイルの INT データを STRING 型として読み取ることができますが、これはお勧めしません。 STRING データを INT 型として読み取ろうとすると、文字列値は NULL に変換されますが、数値は正しく処理されます。

データ型のサポート

説明

次の表で、已开通 はサポートを示し、未开通 はサポートされていないことを示します。

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

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

  • ネイティブモード (テーブルの読み取りに Native ORC Reader を使用する): 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

未开通

未开通

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

圧縮された OSS ファイルの読み書きを行う場合は、CREATE TABLE 文に with serdeproperties 属性を追加します。 詳細については、「with serdeproperties パラメーター」をご参照ください。

読み取り操作と書き込み操作でサポートされているデータファイル形式は、SNAPPY または ZLIB を使用して圧縮された ORC ファイルです。

外部テーブルを作成する

構文

各形式の外部テーブルの構文構造の詳細については、「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 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 のプロパティ

property_name

シナリオ

説明

property_value

デフォルト値

mcfed.orc.schema.resolution

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

ORC ファイルの解析方法を指定します。 値 name は、ファイルが列名で解析されることを示します。

name

列の位置別。 これは、mcfed.orc.schema.resolution'='position' を設定するのと同じです。

TBLPROPERTIES のプロパティ

property_name

シナリオ

説明

property_value

デフォルト値

mcfed.orc.compress

圧縮形式で OSS に ORC データを書き込むには、このプロパティを追加します。

ORC 圧縮プロパティ。 ORC データの圧縮方法を指定します。

  • SNAPPY

  • ZLIB

なし

io.compression.codecs

OSS データファイルが Raw-Snappy 形式の場合は、このプロパティを追加します。

このパラメーターを設定すると、MaxCompute は Raw-Snappy 圧縮データを読み取ることができます。

com.aliyun.odps.io.compress.SnappyRawCodec

なし

データの書き込み

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

データのクエリと分析

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

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

シナリオ

このセクションでは、SNAPPY 圧縮を使用して ORC 外部テーブルを作成し、テーブルからデータを読み書きする方法について説明します。

説明
  • 次のサンプルコードを実行するときは、<uid> を Alibaba Cloud アカウント ID に置き換えます。

  • 次の例で使用されているロールは、aliyunodpsdefaultrole です。 別のロールを使用する場合は、aliyunodpsdefaultrole をターゲットロールの名前に置き換え、ターゲットロールに OSS にアクセスするための権限を付与します。

  1. SNAPPY を使用して圧縮された ORC ファイルを準備します。

    サンプルデータoss-mc-test バケットに、orc_snappy/dt=20250526 フォルダー階層を作成し、snappy ファイルdt=20250526 パーティションフォルダーに保存します。

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

    CREATE EXTERNAL TABLE orc_data_type_snappy
    (
        vehicleId INT,
        recordId INT,
        patientId INT,
        calls INT,
        locationLatitute DOUBLE,
        locationLongtitue 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');
  3. パーティションデータをインポートします。 OSS 外部テーブルがパーティションテーブルの場合は、パーティションデータをインポートするための追加操作を実行する必要があります。 詳細については、「OSS 外部テーブルにパーティションデータを追加するための構文」をご参照ください。

    -- パーティションデータをインポートする
    MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;
  4. ORC 外部テーブルからデータを読み取ります。

    SELECT * FROM orc_data_type_snappy WHERE dt=20250526 LIMIT 10;

    次の結果が返されます。

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongtitue | 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. 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 | locationlongtitue | recordtime     | direction  | dt         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
    | 1          | 16         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | SW         | 20250526   |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+