开发者社区> garygao305> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MaxCompute自定义extractor访问OSS文本文件DateTime类型数据

简介: MaxCompute自定义extractor访问OSS文本文件,官方示例无法支持DateTime数据读入。该文档示范引入joda-time,解决自定义时间日期格式,读入外部非结构化数据。
+关注继续查看

根据产品文档《访问OSS非结构化数据》,自定义Extractor访问OSS。github项目详见:TextExtractor

一、问题

该extractor在读取非结构化数据时,如果字段存在DateTime类型(例如:2019-10-27 19:44:36),会出现如下报错:
20191104162246

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类型参数。不支持时间部分。
20191104162644
20191104163839

二、解决方法

引入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;
读取结果:
20191104170726

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云OSS php 自定义域名 绑定bucket
做OSS图片上传时,可以采用阿里云分配的oss域名,也可以使用自定义域名(绑定用户域名),使用阿里云域名太长,不美观,我使用的绑定用户域名。使用阿里云分配域名时图片文件可以正常上传,使用自定义绑定用户域名时发现报错.
726 0
【OSS全球加速】如何利用CNAME自定义加速区域
1 背景     OSS推出的全球加速功能,客户端离OSS数据中心距离越远加速效果就会越好,比如跨洋或者跨大洲预期会有数倍的性能提升,但是对于很多OSS用户,并不一定需要在所有区域加速。     比如用户在国内有个Bucket,用户会在全球各地上传或下载这个Bucket 内的数据,由于OSS本身提供优质的网络及高质量的BGP多线接入能力,在国内大部分区域访问OSS速度都能做到“很快”,此时如果在国内也使用传输加速的话可以做到“更快”,但是“很快”其实已经能够满足大部分用户的需求,用户不愿意为从“很快”到“更快”买单。
12142 0
OSS定制自定义response header
OSS通过传入"x-oss-persistent-headers"这个头,支持指定非"x-oss-meta-"开头的usermeta,满足特定用户特定场景的需求
7415 0
OSS自定义域名应用及其常见问题排查
本文将介绍OSS自定义域名应用的优势、OSS如何绑定自定域名及OSS自定义域名常见问题排查;
8895 0
OSS上传回调支持自定义header以及v2版本签名
上传回调(callback)是OSS的一个重要功能,可以应用在客户端与服务器端数据同步等一些场景。上传回调功能支持在回调的body中传入信息,但是在一些场景下,用户希望能够在回调给应用服务器的请求header中传入自定义的header,用于满足服务器端的一些特殊需求。
2481 0
自定义LOG投递OSS数据Partition,优化你的计算
数据划分Partition OSS数据存储具有高可靠、低成本等优点,是海量数据存储的最佳选择之一,尤其适用于半结构化的日志存储,并可以结合E-MapReduce(使用Hive、Impala等计算引擎)通过schema-on-read方式加载数据做查询分析。
3610 0
使用oss c sdk自定义上传和下载callback
使用oss c sdk自定义上传和下载callback,简单预处理数据
3768 0
《阿里云 JindoFS+OSS 数据上云实战》电子版地址
为了帮助读者能更全面地了解 JindoFS,我们特地编撰了这本电子书。从架构到场景到实操,全方面解读jindoFS。
0 0
Typora配置阿里云OSS作为图床上传图片
Typora配置阿里云OSS作为图床上传图片
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
百问百答-OSS (上)
立即下载
百问百答-OSS (下)
立即下载
阿里云 JindoFS+OSS 数据上云实战
立即下载