全部產品
Search
文件中心

MaxCompute:自訂解析器

更新時間:Jun 17, 2025

本文為您介紹通過自訂解析器建立OSS外部表格以及讀取和寫入資料的方法。

前提條件

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

  • (可選)已準備好OSS儲存空間(Bucket)、OSS目錄及OSS資料檔案。具體操作請參見建立儲存空間管理目錄簡單上傳

    MaxCompute已支援在OSS側自動建立目錄,對於攜帶外部表格及UDF的SQL語句,您可以通過一條SQL語句執行讀寫外部表格及UDF的操作。原手動建立目錄方式仍然支援。
  • 已建立MaxCompute專案。具體操作請參見建立MaxCompute專案

    由於MaxCompute只在部分地區部署,跨地區的資料連通性可能存在問題,因此建議Bucket與MaxCompute專案所在地區保持一致。
  • 已具備在MaxCompute專案中建立表(CreateTable)的許可權。表操作的許可權資訊請參見MaxCompute許可權

使用限制

  • OSS外部表格不支援cluster屬性。

  • 單個檔案大小不能超過3 GB,如果檔案過大,建議拆分。

注意事項

自訂解析器預設不會對資料分區,以避免解析器出現正確性問題,如果您確認能夠處理分區,可通過如下命令啟用資料分區功能,即啟動多個Mapper。

SET odps.sql.unstructured.data.single.file.split.enabled=true;

建立外部表格

文法說明

CREATE EXTERNAL TABLE [IF NOT EXISTS] mc_oss_extable_name
(
  col_name date_type,
  ...
)
[comment table_comment]
[partitioned BY (col_name data_type, ...)] 
stored BY '<your_defined_storagehandler>' 
WITH serdeproperties (
  ['property_name'='property_value',...]
) 
location 'oss_location' 
USING 'jar_name';

通過其他格式建立OSS外部表格詳情,請參見OSS外部表格

公用參數

公用參數說明請參見基礎文法參數說明

專屬參數

參數名稱

是否必填

說明

your_defined_storagehandler

通過編寫MaxCompute UDF自訂的解析器,更多編寫MaxCompute UDF資訊,請參見開發UDF

jar_name

指定自訂解析器代碼對應的JAR包,該JAR包需要添加為MaxCompute專案資源。

更多添加資源資訊,請參見資源操作

resource_name

當您使用自訂的serde class時,需要指定依賴的資源。資源中包含了自訂的serde class

serde class相關的JAR包需要添加為MaxCompute專案資源。

更多添加資源資訊,請參見資源操作

資料寫入

MaxCompute寫入文法詳情,請參見將資料寫入OSS

查詢分析

樣本:通過自訂解析器建立OSS外部表格

附錄:準備樣本資料中的SampleData/(自訂解析器)目錄建立映射關係。操作流程如下:

  1. 使用MaxCompute Studio建立TextExtractor.javaTextExtractor.javaSplitReader.javaTextStorageHandler.java四個Java類。更多開發Java程式詳情,請參見開發UDF

  2. 通過MaxCompute Studio的一鍵式打包功能,將其中的TextStorageHandler.java打包並上傳為MaxCompute資源。

    假設資源名稱為javatest-1.0-SNAPSHOT.jar。更多打包上傳資訊,請參見打包、上傳及註冊

    說明

    如果有多個依賴請分別打包後上傳為MaxCompute資源。

  3. 執行如下命令建立OSS外部表格。

    CREATE EXTERNAL TABLE ambulance_data_txt_external
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongtitue DOUBLE,
      recordTime STRING,
      direction STRING
    )
    stored BY 'com.aliyun.odps.udf.example.text.TextStorageHandler' 
      WITH serdeproperties (
        'delimiter'='|',  
        'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
      )
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/SampleData/'
    USING 'javatest-1.0-SNAPSHOT.jar'; 
    
    -- 您可以執行desc extended ambulance_data_txt_external;命令查看建立好的外部表格結構資訊。
    說明

    其中delimiter是使用者自訂的、用來決定OSS檔案每行資料不同列值之間的分隔字元,使用者可以選擇任意一個合法的字串。

  4. 從OSS讀取資料,命令樣本如下。

    SELECT recordId, patientId, direction FROM ambulance_data_txt_external WHERE patientId > 25;

    返回結果如下。

    +----------+-----------+-----------+
    | recordid | patientid | direction |
    +----------+-----------+-----------+
    | 1        | 51        | S         |
    | 3        | 48        | NE        |
    | 4        | 30        | W         |
    | 5        | 47        | S         |
    | 7        | 53        | N         |
    | 8        | 63        | SW        |
    | 10       | 31        | N         |
    +----------+-----------+-----------+
  5. 向OSS外部表格寫入資料。

    INSERT INTO ambulance_data_txt_external VALUES (1,16,76,1,'46.81006','-92.08174','9/14/2014 0:10','SW');
    
    -- 重新查詢看是否寫入成功;也可看oss目錄下是否產生了新檔案。
    SELECT * FROM ambulance_data_txt_external WHERE recordId='16';