在我们数据处理的时候取最大分区是一个常有的事,可以说在原始层流出的数据百分之九十九的表都要涉及到最大分区,因为不是增量表就是全量表,所以最大分区怎么取也是一个众说风云的事情,接下来我给大家说说我的经验,供大家参考一下

首先我们不能直接max(time),不然效率上就不能说拖整个数据流的后退了,那简直是裤子都拉没了

也不要有使用hive的show partitions tablename,然后排序取第一个或最大值这样的想法,因为show语句的结果不能做为一个结果集用,会报错的

第一种方式我们可以考虑使用如下的语句

//dt 是datatime的缩写,也就是数据分区
select dt from text_table group by dt having count(*)>0 order by dt limit 1

用这个语句,要考虑使用场景,因为这个语句的目的是取一个有数据的最大分区,所以如果你不需要考虑有没有数据,那么就把having去掉,有人会觉得having多余了,觉得不要就行,其实正常情况下确实是这样,因为没有数据就不会生成分区,但是有某些特殊场景下有没有数据其实是考虑到可能分区被清空了,而不是说接入问题

其次这个语句无法发现数据接入是否异常,如果发生了数据接入异常,比如断了或者失败了,导致没有分区,或分区数据不全,这些问题,我们是不希望其进行之后的数据操作的,而这条语句如果接入失败会导致分区是前一个存在的分区或者是问题分区

第二种情况,是我们在大数据开发中会使用工具,而且我们使用的工具大部分都是企业自己封装研发的,一般情况下都有自带的时间戳获取方式,大家可以问一下相关人员就可以了,这种情况是最舒服的,而且多事情况下都是这样

第三种情况,比较少,如果用的是那些封装的不彻底的工具,比如直接使用azkaban之类的,这些工具,本质上还是底层的东西,比如azkaban,它本质上还是linux的shell脚本,我们可以在脚本中用date命令获取时间格式化成我们想要的分区

后面这两种情况,就不会发生第一种情况中的获取到不正确分区的问题了,最多就是没数据引发的相关问题而已,而且我们也希望问题这样直观的表现出来

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐