MaxCompute自定义extractor访问OSS文本文件DateTime类型数据
根据产品文档《访问OSS非结构化数据》,自定义Extractor访问OSS。github项目详见:TextExtractor。
一、问题
该extractor在读取非结构化数据时,如果字段存在DateTime类型(例如:2019-10-27 19:44:36),会出现如下报错:
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类型参数。不支持时间部分。
二、解决方法
引入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;
读取结果:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spark框架:Win10系统下搭建Scala开发环境
一、Scala环境基础 Scala对Java相关的类,接口进行了包装,所以依赖Jvm环境。 Jdk 1.8 scala 依赖 scala 2.11 安装版本 idea 2017.3 开发工具 二、配置Scala解压版 1)注意路径无空格和中文 2)配置环境变量 添加到path目录 %SCALA_HOME%\bin 3)检测是否安装 配置成功,没错就是这么简单。 三、配置Idea开发 1)插件安装,就是点点点 2)新建两个maven项目在scala-base-hello 的 main 目录下创建scala文件夹,如下标记。 3)添加scala框架 4)创建scala代码文件 5)一起见证下hello-scala 这代码是不是看起来有点四不像? 四、写在结尾 都说万事开头难,现在开了一个完美的头了,剩下的必须都是简单的!!
- 下一篇
es 入门
**注意事项-------使用ealsticsearch要配置java的开发环境JDK(1.8以上) ealsticsearch: 索引(Index) 类型(type) 文档(Document) 字段(Fields) 关系型数据库: 数据库 表 行 列 from elasticsearch import Elasticsearch 默认host为localhost,port为9200.但也可以指定host与port es = Elasticsearch("http://127.0.0.1:9200") 插入数据,index,doc_type名称可以自定义,id可以根据需求赋值,body为内容 es.index(index="my_index",doc_type="test_type",id=0,body={"name":"python","addr":"深圳"})es.index(index="my_index",doc_type="test_type",id=1,body={"name":"java","addr":...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G