全部產品
Search
文件中心

MaxCompute:ORC外部表格

更新時間:Feb 07, 2026

本文介紹ORC格式的OSS外部表格的建立、讀取及寫入方法。

適用範圍

建立外部表格

文法結構

當ORC檔案中的Schema與外表Schema不一致時:

  • 列數不一致:如果ORC檔案中的列數小於外表DDL的列數,則讀取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屬性參數

property_name

使用情境

說明

property_value

預設值

mcfed.orc.schema.resolution

當同一張OSS外部表格中資料的Schema不一致時,請添加該屬性。

用於設定ORC檔案解析方式,name表示根據列名解析。

name

預設按列號解析。

等價於: 'mcfed.orc.schema.resolution'='position'

tblproperties屬性參數

property_name

使用情境

說明

property_value

預設值

mcfed.orc.compress

當需要將ORC資料以壓縮方式寫入OSS時,請添加該屬性。

ORC壓縮屬性。指定ORC資料的壓縮方式。

  • SNAPPY

  • ZLIB

io.compression.codecs

當OSS資料檔案為Raw-Snappy格式時,請添加該屬性。

配置該參數值為True時,MaxCompute才可以正常讀取壓縮資料,否則MaxCompute無法成功讀取資料。

com.aliyun.odps.io.compress.SnappyRawCodec

odps.external.data.output.prefix

(相容odps.external.data.prefix)

當需要添加輸出檔案的自訂首碼名時,請添加該屬性。

  • 僅包含數字,字母,底線(a-z, A-Z, 0-9, _)。

  • 長度在1-10之間。

合格字元組合,例如'mc_'。

odps.external.data.enable.extension

當需要顯示輸出檔案的副檔名時,請添加該屬性。

True表示顯示輸出檔案的副檔名,反之不顯示副檔名。

  • 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"。

mcfed.orc.batch.size

控制每次處理的記錄數量,影響記憶體使用量和處理效率。

ORC的調優屬性。定義ORC預設批次大小,以行為單位。

非負整數

1000

寫入資料

MaxCompute寫入文法詳情,請參見寫入文法說明

查詢分析

  • SELECT文法詳情,請參見查詢文法說明

  • 最佳化查詢計劃詳情,請參見查詢最佳化

  • ORC外部表格支援通過開啟PPD(即Predicate Push Down)實現查詢最佳化,需要在SQL前加如下參數:

    PPD參數需在Native模式下使用,即Native開關需為true。

    -- 開啟orc native reader。
    SET odps.ext.oss.orc.native-true;
    
    -- 開啟orc ppd。
    SET odps.storage.orc.use.predicate.pushdown=true; 

情境樣本

建立以SNAPPY壓縮的ORC格式外表,並進行資料讀取和寫入操作。

  1. 前置準備

    1. 建立MaxCompute專案

    2. 已準備好OSS儲存空間(Bucket)、OSS目錄。具體操作請參見建立儲存空間管理目錄

      由於MaxCompute只在部分地區部署,跨地區的資料連通性可能存在問題,因此建議Bucket與MaxCompute專案所在地區保持一致。
    3. 授權

      1. 具備訪問OSS的許可權。阿里雲帳號(主帳號)、RAM使用者或RAMRole身份可以訪問OSS外部表格,授權資訊請參見OSS的STS模式授權

      2. 已具備在MaxCompute專案中建立表(CreateTable)的許可權。表操作的許可權資訊請參見MaxCompute許可權

  2. 準備SNAPPY格式資料檔案。

    樣本資料oss-mc-testBucket中建立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模式(讀表時不使用Native ORC Reader):set odps.ext.oss.orc.native=false;,支援讀寫。

  • Native模式(讀表時使用Native ORC Reader):set odps.ext.oss.orc.native=true;,僅支援讀。

模式

Java模式(讀寫)

Native模式(唯讀)

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屬性參數

  • 支援讀寫的資料檔案格式:以SNAPPY、ZLIB方式壓縮的ORC。

支援Schema Evolution

ORC外部表格的schema和檔案列之間有兩種映射關係,按位置映射和按名稱映射。

  • 按位置映射:建立外表時配置參數'mcfed.orc.schema.resolution'='position'或者不配置(即預設值),表的列順序必須與檔案中欄位的順序完全一致,系統根據位置或列號來匹配。

  • 按名稱映射:建立外表時配置參數'mcfed.orc.schema.resolution'='name',系統會根據列名自動匹配,不再依賴順序。

下表中的資料相容問題說明是指:已經進行Schema Evolution操作後的外表,針對“符合修改後的Schema結構的資料”是否可以正常讀取;針對於“存量舊Schema資料”(即和修改後schema不匹配的存量資料)是否可以正常讀取。

操作類型

映射方式

是否支援

說明

資料相容問題說明

添加列

按位置映射

支援

  • 添加的新列不支援指定順序,預設在最後一列。

  • 添加設定預設值的普通列,僅對MaxCompute側寫入的資料生效。

  • 符合修改後的Schema結構的資料,可以正常讀取。

  • 存量舊Schema資料沒有進行修改列操作,該表按新Schema讀。

    例如:表添加列後,歷史資料沒有添加對應列,讀表時該列的歷史資料會補為NULL。

按名稱映射

支援

刪除列

按位置映射

不支援

不建議使用,ORC外部表格按位置映射列值,表的列順序必須與檔案中欄位順序一致,刪除列操作後,檔案和表欄位不匹配,讀表時會報錯。

  • 符合修改後的Schema結構的資料,可以正常讀取。

  • 存量舊Schema資料沒有進行修改列操作,該表按新Schema讀。

    例如:表刪除列後,歷史資料沒有刪除對應列,讀表時會報錯。

按名稱映射

支援

按名稱映射,系統會根據列名自動匹配,不再依賴順序。

相容

修改列順序

按位置映射

不支援

不建議使用,ORC外部表格按位置映射列值,表的列順序必須與檔案中欄位順序一致,刪除列操作後,檔案和表欄位不匹配,讀表時會報錯。

  • 符合修改後的Schema結構的資料,可以正常讀取。

  • 存量舊Schema資料沒有進行修改列操作,該表按新Schema讀。

    例如:表修改列順序後,歷史資料沒有修改列順序,會出現Schema和資料不對應的情況。

按名稱映射

支援

按名稱映射,系統會根據列名自動匹配,不再依賴順序。

相容

更改列資料類型

按位置映射

支援

資料類型支援轉換表見更改列資料類型

相容

按名稱映射

支援

修改列名

按位置映射

支援

相容

按名稱映射

不支援

不建議使用,按名稱映射,系統會根據列名自動匹配,修改列名後,原來能匹配到的列名可能會在檔案裡匹配不到。

  • 符合修改後的Schema結構的資料,可以正常讀取。

  • 存量舊Schema資料沒有進行修改列操作,該表按新Schema讀。

    例如:表修改列名後,當ORC檔案Schema沒有修改對應列名,讀表時該列為空白。

修改列注釋

按位置映射

支援

注釋內容為長度不超過1024位元組的有效字串,否則報錯。

相容

按名稱映射

支援

修改列的非空屬性

按位置映射

不支援

不支援此操作,預設為Nullable。

不涉及

按名稱映射

不支援