一、简述
select max_pt('tableName')
对于分区的表,此函数返回该分区表的一级分区的最大值,按字母排序,且该分区下有对应的数据文件。
说明:
tableName:String 类型,指定表名(必须带上 project 名,例如:prj.src),用户必须拥有该表的读权限。
返回值:最大的一级分区的值。
例:tab 是分区表,该表对应的分区如下,且都有数据文件。
pt='20080807'
pt='20080808'
select * from tab where pt=max_pt('project.tab');
该语句 max_pt 值为“20080808”,阿里云 ODPS 数据库 SQL 语句读出 pt='20080808' 分区下的数据。
备注:如果只是用 alter table 的方式新加了一个分区,但是此分区中并无任何数据文件,则此分区不会做为返回值。
二、使用场景
max_pt 是个非常好用的函数,可以获取分区表的最新分区,正因为好用,促成使用人员养成了在任意场景下都使用 max_pt 来替代 '${bizdate}' 的习惯。什么场景下会使用?
- 当天数据无法及时产出,想使用最近一个分区的数据。
- 使用最新分区的数据,回刷历史某一天的数据。
三、使用 max_pt 可能引发的风险
- 部分任务会产出未来日期的分区,比如某业务订单表 ccbOrder 有 20080808 分区,把未完结订单都放在 20080808 分区里,此时用 max_pt 可能会取不到想要的数据。
- 同一个结果表,分多段 insert 数据至同一结果表,当多段任务并未完成时,使用 max_pt 获取不到全量数据
- 当 datax 同步任务刚添加好分区,数据未完成同步,使用 max_pt,只获取了部分数据
- 回刷数据,确保数据源自历史分区数据状态,使用 max_pt 达不到这个目的。