天天看點

MaxCompute自定義extractor通路OSS文本檔案DateTime類型資料

根據産品文檔《通路OSS非結構化資料》, 自定義Extractor通路OSS 。github項目詳見: TextExtractor

一、問題

該extractor在讀取非結構化資料時,如果字段存在DateTime類型(例如:2019-10-27 19:44:36),會出現如下報錯:

MaxCompute自定義extractor通路OSS文本檔案DateTime類型資料
FAILED: ODPS-0123131:User defined function exception - Traceback:
java.lang.IllegalArgumentException
    at java.sql.Date.valueOf(Date.java:143)
    at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194)
    at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153)
    at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120)           

根據堆棧,檢視指定位置的代碼:Date.valueOf(parts[i]),其中java.sql.Date.valueOf(),查詢該函數官方文檔,發現隻能支援形如:"yyyy-[m]m-[d]d"的String類型參數。不支援時間部分。

MaxCompute自定義extractor通路OSS文本檔案DateTime類型資料
MaxCompute自定義extractor通路OSS文本檔案DateTime類型資料

二、解決方法

引入joda-time依賴

<dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>2.10</version>
</dependency>           
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;           

引入DateTimeFormat.forPattern(),指定日期格式對文本資料進行讀取。

record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getMillis()));           

三、結果驗證

1. extractor項目打包生成jar包,通過odpscmd上傳resource

add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar

/Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar,替換為本地實際jar包路徑

另外,extractor使用了Joda-Time,需要額外添加第三方包。

add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar

/Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar,替換為本地實際jar包路徑

2. DDL建表,直接在odpscmd或者datastudio執行

CREATE EXTERNAL TABLE video_play_log
(
    UUID STRING
    ,action STRING
    ,ip STRING
    ,time datetime
)
STORED BY 'me.gary.test.odps.examples.TextStorageHandler'
WITH SERDEPROPERTIES ( 
 'odps.properties.rolearn'='acs:ram::<填寫主賬号uid>:role/aliyunodpsdefaultrole',
 'delimiter'='^'  --SERDEPROPERITES可以指定參數,這些參數會通過DataAttributes傳遞到Extractor代碼中。
 )
 LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/<Bucket名稱>/<目錄名稱>/'
 USING 'text_extractor-1.0-SNAPSHOT.jar,joda-time-2.10.jar';           

odps.properties.rolearn中的資訊是RAM中AliyunODPSDefaultRole的ARN資訊。通過RAM控制台中的角色詳情擷取。

OSS的連接配接格式為oss://oss-cn-shanghai-internal.aliyuncs.com/Bucket名稱/目錄名稱/。按實際資訊替換

3. 上傳測試資料至oss bucket的指定目錄,命名video_play_log.txt。

5c661071dba64d5080c91da085ff1073^視訊播放頁-點選-快進^27.17.94.60^2019-10-27 19:44:36           

4. select外部表

select * from <project_name>.video_play_log;

讀取結果:

MaxCompute自定義extractor通路OSS文本檔案DateTime類型資料