MaxCompute有一套自己的导数据脚本格式,不过对于新手只要打开数据集成就可以看到创建引导。新手建议使用向导模式,只要填表就可以完成的差不多。不过对于普通数据库的导入来说,还是有其特殊性。
首先要了解ODPS的表多是分区表,需要指定一个分区键,在他的创建引导下,分区键默认为${bdp.system.bizdate},也就是业务日期(business date),这是一个yyyymmdd格式的字符串。在某种意义下也说明了导数据是按天导入的,也就是导入业务日期当天的数据。那么这样一来最大的疑问就是如何全表导入呢,这个问题留在后面。
知道了这一点就可以开始跟着向导走了,第一页需要设置导入数据的条件,这里一方面可以做数据过滤,一方面就是指明分区中的数据范围。特别是对于日志型的数据,要根据时间列筛选出业务日期当天的数据,比如:
unix_timestamp(str_to_date('${bdp.system.bizdate}', '%Y%m%d'))<=created AND created<(unix_timestamp(str_to_date('${bdp.system.bizdate}', '%Y%m%d'))+86400)
我的表中created是unix时间戳,如果表中有datetime类型时间戳的话上面条件可省去一层转换。
第一页还有一点比较费解的是要你选insert overwrite 和 insert into ,区别是insert overwrite 会在导入之前清除数据,而insert into是追加,类似unix管道的 > 与 >>操作符。我认为,如果是日志型就是insert into,如果是其他类型,比如用户表就是insert overwrite,因为用户的信息如昵称等是会发生改变的。所以这种数据最好是清空数据全表导入,而且设置条件的时候不需要根据业务日期进行筛选。
其实过了这一步后面的东西都很好理解了。完成之后记得提交为周期任务,我设置的是每天执行一次,执行的业务日期是执行日期的前一天,比如2018-03-25 01:00执行任务,那么对应的业务日期就是2018-03-24。
那么我们再说历史数据怎么导呢?其实这个不用愁,创建每日定时任务之后前往“运维中心”。在周期任务管理下会看到有一个补数据就是针对这一需求而来的,你可以选定一个很大的时间范围,他会帮你执行对应时间内应该运行的任务。补数据还可以设置并发执行,而且执行效率其实还挺高,对数据库的压力并不大。