本文為您介紹通過自訂解析器建立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/(自訂解析器)目錄建立映射關係。操作流程如下:
使用MaxCompute Studio建立TextExtractor.java、TextExtractor.java、SplitReader.java和TextStorageHandler.java四個Java類。更多開發Java程式詳情,請參見開發UDF。
通過MaxCompute Studio的一鍵式打包功能,將其中的TextStorageHandler.java打包並上傳為MaxCompute資源。
假設資源名稱為
javatest-1.0-SNAPSHOT.jar。更多打包上傳資訊,請參見打包、上傳及註冊。說明如果有多個依賴請分別打包後上傳為MaxCompute資源。
執行如下命令建立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檔案每行資料不同列值之間的分隔字元,使用者可以選擇任意一個合法的字串。
從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 | +----------+-----------+-----------+向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';