最近负责的项目,须要对接淘宝提供的 淘宝api,获取淘宝客的订单数据。在此过程当中遇到了不少坑,特在此mark一下,可能对于一些大佬来讲很简单,若是发现有错误欢迎指出。全部过程以下所示:java
下面针对每一步进行介绍,并说明遇到的坑python
鉴于maven的依赖管理优点,先利用Intellij IDEA 建立maven项目。
ios
由于本项目依赖淘宝api的jar包,须要下载相应的sdk,其中提供了API的请求封装、摘要签名、响应解释、消息监听等功能,使用SDK能够轻松完成API的调用,API结果的获取,消息的实时监听。web
这里遇到了第一个坑:一开始考虑到python对jason的解析更方便(本人对python也更熟悉。。),想使用python写,可是调api时须要提供port,然而没拿到,最后仍是使用了java。shell
使用淘宝api的步骤:(官方文档介绍)json
安装完后,仓库和pom文件以下图所示:
maven在本地仓库中查找jar包是按照:groupId目录 到 artifactId目录 再到version目录的顺序查找。api
用java编写,由于后面要解析json,所以须要在pom文件中添加以下依赖:
数组
淘宝提供的请求示例以下图所示(官方文档):
maven
响应式例:svg
以订单建立时间为准,天天获取前一天的数据,参数start_time设置每次请求的时间(取每分钟请求一次),setSpan设置每次查询时长(设置为60秒),所以要获取一天的数据就调用1440次。很容易能跑通该示例,最终结果形式为:
解析json采用java bean的方式,将json转换成java对象,这里遇到第二个大坑:由于返回的json包含三层,所以一开始写了四个java实体类,可是可能对应关系没弄好,一直报错,太菜又一直没找到缘由(心态有点小崩),最后在大神导师的指点下,直接用原生解析的方式获取最内层(n_tbk_order对应的json数组),而后再转换成java对象,只须要一个bean文件(见下图)就行。灵活变通仍是很重要的啊!!
这里还有第三个坑:一开始大体观察数据(json字符串很长),觉得返回的json数组中只包含一条订单数据,后来发现数据对不上,所以后来对数组遍历,果真发现数据`·量增长了,写代码逻辑必定要严谨啊!!
由于最终脚本要放在线上开发机上跑,所以须要打成jar包。一开使用Intellij IDEA 自带的project structure,但后来在开发机上一直报错,后来尝试使用maven插件,在pom文件中添加下列代码:
注意:记得修改mainClass的值,路径为:主程序包名.main程序名
最后在终端切换到maven项目根目录,执行命令:mvn clean package -Dmaven.test.skip=true -Dcheckstyle.skip=true,会在
便可在target目录下生成所需的jar包(名字中不带original的)。
坑四:一开始在经常使用的开发机上跑,可是貌似不能访问外网,所以一直访问gw.api.taobao.com/router/rest出错,后来换了一台线上开发机,成功跑通了。。
在开发机生成订单数据对应的csv后,编写shell脚本将其load到hive表中,方便后续的分析使用。由于是明细数据,所以建成fact表。
建立分区表:
CREATE TABLE ks_ad.dw_fact_commiosity_detail_di(id int,name string) partitioned by (dt STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’STORED AS TEXTFILE;
插入数据:
load data local inpath ‘owwo/xxx.csv’ into table xxx PARTITION (partcol1=val1, partcol2=val2 …)
编写好shell脚本后,由于咱们想要它天天定时执行,例如天天早上6点,这是就须要crontab命令,执行crontab -e添加用户调度任务。
crontab文件的含义:用户所创建的crontab文件中,每一行都表明一项任务,每行的每一个字段表明一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式以下:
minute hour day month week command 顺序:分 时 日 月 周 任务
本项目设置的是天天早上6段执行,以下所示:
00 06 * * * xx/taobao.sh >> yy.log 2>&1
上面命令后半段是将成的标准输出添加到log文件中,方便查看报错。
其中& 1 ,表示文件描述符 1指标准输出stdout。
对于2,表示标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出,而标准输出已经重定向到了yy.log中,所以最终都会在log中显示。
这里还有个坑:
完成上面的步骤后,在hive中就能够获得咱们所需的订单数据表了。后面根据业务需求,与其余进行数据进行关联分析。
虽然这只是一个小需求,可是种种bug仍是让人很头疼。固然最开心的是,在解决的过程当中本身学到了不少东西。很是感谢个人mentor,他的耐心解答为我提供了很是大的帮助。