1. MAXCOMPUTE(原odps)踩坑:
1、 在使用split_part(info, ‘|’, 1)函数切分数据时,要格外注意分隔符’|’,尤其是涉及有非字母、数字的数据,其中可能会夹杂’|’,这样就导致取出的数据不一致;其实是应该注意切分之前的字符串组装concat()函数,在组装时使用的分隔字符。
2、 odps是一个数据仓库,有分层的概念,它的dwd层类型数据库,又有全量更新的dd类型(即,每天更新历史和最近一天新增一天数据)和每天增量更新的ds类型(即,每天的数据存放在一个分区)。dd表遇到一个坑是:有可能按前一天取数据仍然还没有或没更新,这样可以利用max求最近一天数据:
select * from table_name
where partition_name IN (select max(partition_name) from table_name));
3、延伸2,odps提交工作流任务有几个概念:
1. 今天提交的任务明天到调度时间时才会运行;
2. 今晚12点之前会使用最新提交的代码生成明天要跑的实例;
3. 实例生成之后就跟代码没有关系;
4. 停止一个周期任务运行只能通过删除代码的方式。
最好不要使用to_char(dateadd(getdate(), 0, 'dd'), 'yyyymmdd'),即getdate()获取分区时间,因为odps任务涉及几类时间:
1. 业务时间:运行时间 - 1天(运行时间减一天);
2. 调度时间:阿里云周期调度时间,可能会存在排队现象;
3. 运行时间:任务被调度后获得计算资源时间。(getdate()获得的时间,
这个时间可能和计算逻辑想要的时间有偏差)
4、odps select if()语句中支持like,不支持in;
5、如果需要concat()数据,需要将空值补一个值,因为 concat('a', null, 'b') = NULL,一个null会导致所有值都失效。
2. 计算一个区域的流入流出,直接上图
相当于是两张表join,假设A表为新表,B表为旧表,则黄色部分为流入,深蓝色为流出,浅蓝色为两天都存在。计算时可以先做一个full outer join, 然后当B.key is null,则为流入;A.key is null,则为流出。