一、概念解释
分区表是指拥有分区空间的表,即在创建表时指定表内的一个或者某几个字段作为分区列。分区表实际就是对应分布式文件系统上的独立的文件夹,一个分区对应一个文件夹,文件夹下是对应分区所有的数据文件。分区可以理解为分类,通过分类把不同类型的数据放到不同的目录下。分类的标准就是分区字段,可以是一个,也可以是多个。分区表的意义在于优化查询。查询表时通过指定所需查询的分区,避免全表扫描,提高处理效率,降低计算费用。使用数据时,如果指定需要访问的分区名称,则只会读取相应的分区。
在Dataphin的集成管道中,MaxCompute、Hive和TDH Inceptor组件中,选择表后会判断是否是分区表,如果是分区表的话则需要填写分区配置。
二、场景及功能
场景一:某企业有一个每天定时调度的集成任务,来源表是一张MaxCompute的分区表,每天会抽取ds=${bizdate}的分区数据进行数据同步。某天该集成任务运行失败了,原因是前一天因某种原因未产生当日业务数据,所以没有产生当日分区,此时集成任务抽取该表的ds=${bizdate}分区会发现该分区不存在,导致任务失败,然后导致后续链路上的任务也无法进行调度运行,数据无法产出。未产生该分区的原因可能是因为当日就是没有产生数据,对业务来说属于正常情况;也可能未产生分区属于异常情况,需要及时被感知并处理。
对应功能:MaxCompute、Hive、TDH Inceptor输入组件支持分区不存在时的选择策略。MaxCompute输入组件支持“置任务失败”、“置任务成功,无数据写入”和“使用最新非空分区”策略;Hive、TDH Inceptor输入组件支持“置任务失败”和“置任务成功,无数据写入”策略。
【Dataphin V3.9及以上支持该功能】
- 如果下游任务一定依赖当日分区的数据才可运行,选择“置任务失败”策略,在当日分区没有及时产出时,集成任务运行时找不到分区便会置任务失败,并及时告警运维人员异常情况,及时处理修复。
- 如果在特定业务场景下,不一定每天会产生分区,可以选择“置任务成功,无数据写入”,集成任务调度时如没有抽取到该分区,任务也会运行成功,支持没有数据写入,这样可以不阻塞下游任务的运行。
- 如果来源表是一张维表,每日数据的变动基本不大,后续任务在产出时间上有要求,但对于这张维表的当日变化感知不强,可以考虑选择“使用最新非空分区”策略,在当日分区没有及时产出时,使用最新非空分区的数据进行下游任务的数据处理。
场景二:某企业的业务数据有可能会延后录入数据库,比如每天都会收集并更新前七天的数据库到指定的日期分区中。此时就需要创建一个每天调度的集成任务抽取运行当日的业务时间及之前六天的共七个分区数据到中台然后进行后续的数据处理。
对应功能:MaxCompute、Hive、TDH Inceptor输入组件支持抽取多分区数据。
【Dataphin V3.10及以上支持该功能】
抽取单分区数据时,可以直接输入等式来指定需要读取的分区,如ds=${bizdate}。如果需要抽取多个分区的数据,如上述场景所述,每天都需要抽取业务时间及之前六天的七个分区,可以在集成管道属性配置中配置一个参数作为集成任务调度时业务时间的七天前,例如seven_days=${yyyymmdd-7},然后在输入组件的分区配置中使用 /*query*/ds>${seven_days}的语法来指定抽取这天之后的所有分区。需注意的是,抽取多分区需要在条件上加上 /*query*/再写条件。
三、总结
当来源表为分区表时,Dataphin集成管道提供了分区不存在时的策略,以及读取多分区的能力,以应对不同的业务场景。