在我们数据处理的时候取最大分区是一个常有的事,可以说在原始层流出的数据百分之九十九的表都要涉及到最大分区,因为不是增量表就是全量表,所以最大分区怎么取也是一个众说风云的事情,接下来我给大家说说我的经验,供大家参考一下
首先我们不能直接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
用这个语句,要考虑使用场景,因为这个语句再执行上来讲和max一样也会全表扫描,效率上差不多,但它的目的是取一个有数据的最大分区,或是当你的例行化任务存在要操作的时间间隔不一致而导致的无法通过现有的便捷方法直接获取最大分区的问题
其次这个语句无法发现数据接入是否异常,如果发生了数据接入异常,比如断了或者失败了,导致没有分区,或分区数据不全,这些问题,我们是不希望其进行之后的数据操作的,而这条语句如果接入失败会导致分区是前一个存在的分区或者是问题分区
第二种情况,我们在大数据开发中会使用工具,而且我们使用的工具大部分都是企业自己封装研发的,一般情况下都有自带的时间戳获取便捷方式,通常是用{DATE}这种格式直接就能获取,大家可以问一下RD、PM或者DBA就可以了,这种情况是最舒服的,而且多事情况下都是这样
第三种情况,比较少,如果用的是那些封装的不彻底的工具,比如直接使用azkaban之类的,这些工具,本质上还是底层的东西,比如azkaban,它本质上还是linux的shell脚本,我们可以在脚本中用date命令获取时间格式化成我们想要的分区
后面这两种情况,就不会发生第一种情况中的获取到不正确分区的问题了,最多就是没数据引发的相关问题而已,而且我们也希望问题这样直观的表现出来

7906

被折叠的 条评论
为什么被折叠?



