具体实施方式
下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本申请,而不能理解为对本申请的限制。
下面参考附图描述根据本申请实施例的数据导入方法和装置。需要说明的是,本申请提出的数据导入方法和装置前提需依赖云平台调度系统。
图1是根据本申请一个实施例的数据导入方法的流程图。如图1所示,该数据导入方法可以包括:
S101,访问版本表,并根据版本表获取当前有效全量数据和次新全量数据。
其中,在本申请的实施例中,版本表可具有第一状态、第二状态和第三状态,其中,第一状态为历史有效的状态,第二状态为增量数据已经导入且等待版本切换的状态,第三状态为当前有效的状态。也就是说,版本表中可设置有3个状态,即第一状态、第二状态和第三状态,如第一状态(如用数字表示0)可表示历史有效的状态,第二状态(如用数字表示2)可表示数据已经导入且等待版本切换的状态,第三状态(如用数字表示1)可表示当前有效的状态。可以理解,版本表中具有当前有效全量数据所在表与数据导入方法和装置所在表对应的状态值。
具体地,在导入数据之前,可先访问版本表,之后可根据版本表中第一状态、第二状态和第三状态所对应的状态值获取相应的当前有效全量数据和次新全量数据,即可在版本表中找到被定义为第三状态的表名,该表名对应的表即为当前有效全量数据所在表,找到被定义为第一状态的表名,该表名对应的表即为次新全量数据。
S102,获取当前最新全量数据,并根据当前最新全量数据和次新全量数据生成增量数据。
具体而言,在本申请的实施例中,根据当前最新全量数据和次新全量数据生成增量数据的具体实现过程可如下:将当前最新全量数据与次新全量数据进行增量差异比较以生成增量数据。更具体地,可将当前最新全量数据与次新全量数据进行增量计算,以得到当前最新全量数据与次新全量数据之间的增量变化部分数据。
其中,可以理解,数据增量指的是当前最新全量数据与次新全量数据中数据差异部分的内容。数据差异指的是当前最新全量数据所在表与次新全量数据所在表中的主键相同,且数据内容不一样的数据,这是因为主键不相同的数据不具有可比性。例如,以当前最新全量数据所在表为A表、次新全量数据所在表为B表为例,A表和B表的增量差异其实是包含三部分内容:1)数据在A表中存在,在B表中不存在;2)数据在A表、B表都存在且内容不一样;3)数据在A表中不存在,在B表中存在。由此,可将获取到的当前最新全量数据与次新全量数据进行增量差异对比,得到当前最新全量数据与次新全量数据之间具有数据差异的部分内容作为增量数据。
S103,将增量数据导入至次新全量数据,并根据当前有效全量数据和导入后的次新全量数据进行版本切换。
可以理解,由于当前有效全量数据正在被线上应用使用,所以当前最新全量数据相对于当前有效全量数据而言,当前最新全量数据为离线数据,因此可以理解,增量数据也为离线的数据。在本申请的实施例中,可通过数据同步工具将离线的增量数据导入至次新全量数据中。之后,可将导入后的次新全量数据作为新的当前有效全量数据,并将当前有效全量数据作为新的次新全量数据以完成版本的切换。其中,数据同步工具可包括但不限于异构数据源数据交换工具Datax、DBSync工具等。
例如,以数据同步工具为Datax工具为例,也就是说,在本步骤中,将增量数据导入线上数据库(如Mysql数据库)表的实现方式可以是通过Datax工具来实现,其中,Datax工具导入数据的基本思路可如图2所示:可读取Datax配置,并根据Datax配置获取大数据平台中所包含的所有具体表和分区,之后,可通过Datax配置获取目标Mysql库和目标表A_0或者A_1表,然后,读入大数据平台表及分区数据(实际上式数据文件),最后,通过Java JdbC工具以Mysql Replace方式将数据写入具体表中。
当增量数据导入到次新全量数据之后,可对当前有效全量数据所在表和导入后的次新全量数据所在表进行版本切换,也就是说,将导入后的次新全量数据所在表作为当前有效版本,以用于在线应用提供服务,并将原当前有效全量数据所在表作为历史有效版本,以备份且用于下次导数据时作为待导入表。
进一步的,在本申请的一个实施例中,在根据当前有效全量数据和导入后的次新全量数据进行版本切换的同时,该数据导入方法还可包括:分别更新版本表中的第一状态、第二状态和第三状态所对应的状态值。具体地,当将导入后的次新全量数据作为新的当前有效全量数据,并将原当前有效全量数据作为新的次新全量数据以完成版本的切换的同时,还需在版本表中,将导入后的次新全量数据所对应的状态值从第二状态变为第三状态,并将原当前有效全量数据所对应的状态值从第三状态变为第一状态,以实现版本表中所包含的表的状态进行更新。
为了使得本领域的技术人员能够更加清楚地了解本申请,下面可举例说明。
举例而言,本申请实施例的数据导入方法引入A表和B表的概念,并建立一个版本表,该版本表可包括A表和B表当前的状态,当进行数据导入之前,可先访问版本表,根据版本表中的状态确定当前有效全量数据所在表和次新全量数据所在表,假设当前A表正在被使用(即上述的当前有效全量数据所在表),那么B表为次新全量数据所在表。当有数据更新时,可先获取当前最新全量数据,并将当前最新全量数据与B表进行增量比较以得到增量数据,之后,可将该增量数据导入到B表中,并在增量数据导入结束后,将导入过数据的B表中的数据作为新的当前有效全量数据(即作为新的当前有效版本),并将原A表(即原当前有效全量数据所在表)中的数据作为新的次新全量数据,即在数据导入之后将有效版本从A表切换成B表,同时将版本表中A表与B表对应的状态值进行更新。可以看出,下次进行导增量数据时,可将增量数据导入A表,导完之后从B表切换回A表,使得A表作为当前有效表。由此,通过这种AB表的交替方式,保证批量导数据表和在线服务的表不是同一张表,一定程度上解决读写同一张表所带来的一些缺陷的问题。
需要说明的是,本申请实施例的数据导入方法由于是交替式增量导数据,所以在任务开始之初的第1、第2次导数据任务时,其实都是全量数据进行导入的,只有在第3次导数据时,才可以理解为增量方式的导数据。具体地,当离线产生增量数据的任务时,一定要先判断当前导数据任务是第1次、第2次还是第3次。例如,假如第1次导入线上的数据是biz_date-2,第2次导入的数据是biz_date-1,那么当前导入的数据biz_date-0应该是全量biz_date-0所在表跟biz_date-2所在表之间的增量,并将该增量导入到biz_date-2的表上。还需要说明的是,在使用最新数据时,历史数据需要清除,目前清除数据方案是主键保留,数据列清空。
下面将举例说明导数据的实现过程:假设大数据分析平台的数据,按每天一份全量保存,所以将一天的数据叫做一个分区,并假设大数据分析平台数据从2015-05-01开始每天产生一份A表全量数据,目前要将A表导入线上Mysql数据库提供给应用使用,假设线上有A_0、A_1两张表,如图3(a)所示,由于线上Mysql数据库是第一天开始导数据,所以导数据之前,Mysql数据库中的A_0表和A_1表中的数据均为空,所以,将当前最新数据(即2015-05-01这天所产生的全部数据)全部倒入线上A_0表中,此时,A_0表中的数据作为当前有效全量数据。如图3(b)所示,当将第二天(即2015-05-02)产生的全部数据进入导入时,由于目前A_1表中的数据为空,所以,可将第二天(即2015-05-02)产生的全部数据导入到线上A_1表中,此时,将A_1表中的数据作为当前有效全量数据,A_0表中的数据作为次新全量数据。如图3(c)所示,当第三天导数据时,需要将增量数据导入A_0表中,但是A_0表中已经存在2015-05-01的数据,所以需要对A_0表中的数据进行增量计算,即2015-05-03的增量数据=2015-05-03所具有的全量数据与2015-05-01的全量数据进行比较,之后将计算结果导入A_0表中,同时可认为A_0表就是当前2015-05-03的全量数据。
还需要说明的是,在本申请的实施例中,如果出现导入生产的数据存在问题,则可根据版本表将当前有效表切换为之前设置为历史有效表(即次新全量数据所在表),即将之前设置为历史有效表作为当前有效表,这是因为之前确保了历史次新全量数据是真实且有效,由此,可以降低数据风险,减少问题的扩大。
本申请实施例的数据导入方法,可先访问版本表,并根据版本表获取当前有效全量数据和次新全量数据,之后,获取当前最新全量数据,并根据当前最新全量数据和次新全量数据生成增量数据,以及将增量数据导入至次新全量数据,并根据当前有效全量数据和导入后的次新全量数据进行版本切换,即通过引入当前有效全量数据所在表和次新全量数据所在表的概念,并通过版本表根据交替式增量导数据的思想,保证了批量到数据表和在线服务的表不是同一张表,解决了现有技术中读写同一张表所存在的一些缺陷的问题,如通过不同表的切换,避免了在读写数据并存时限制导数据并发量的现象,从而提高了数据的导入效率。
为了实现上述实施例,本申请还提出了一种数据导入装置。
图4是根据本申请一个实施例的数据导入装置的结构示意图。如图4所示,该数据导入装置可以包括:获取模块10、生成模块20、导入模块30和切换模块40。
具体地,获取模块10可用于访问版本表,并根据版本表获取当前有效全量数据和次新全量数据。其中,在本申请的实施例中,版本表可包括但不限于第一状态、第二状态和第三状态等,其中,第一状态为历史有效的状态,第二状态为增量数据已经导入且等待版本切换的状态,第三状态为当前有效的状态。也就是说,版本表中可设置有3个状态,即第一状态、第二状态和第三状态,如第一状态(如用数字表示0)可表示历史有效的状态,第二状态(如用数字表示2)可表示数据已经导入且等待版本切换的状态,第三状态(如用数字表示1)可表示当前有效的状态。可以理解,版本表中具有当前有效全量数据所在表与数据导入方法和装置所在表对应的状态值。
更具体地,在导入数据之前,获取模块10可先访问版本表,之后可根据版本表中的状态值获取相应的当前有效全量数据和次新全量数据,即可在版本表中找到被定义为第三状态的表名,该表名对应的表即为当前有效全量数据所在表,找到被定义为第一状态的表名,该表名对应的表即为次新全量数据。
生成模块20可用于获取当前最新全量数据,并根据当前最新全量数据和次新全量数据生成增量数据。具体而言,在本申请的实施例中,生成模块20根据当前最新全量数据和次新全量数据生成增量数据的具体实现过程可如下:将当前最新全量数据与次新全量数据进行增量差异比较以生成增量数据。更具体地,生成模块20可将当前最新全量数据与次新全量数据进行增量计算,以得到当前最新全量数据与次新全量数据之间的增量变化部分数据。
其中,可以理解,数据增量指的是当前最新全量数据与次新全量数据中数据差异部分的内容。数据差异指的是当前最新全量数据所在表与次新全量数据所在表中的主键相同,且数据内容不一样的数据,这是因为主键不相同的数据不具有可比性。例如,以当前最新全量数据所在表为A表、次新全量数据所在表为B表为例,A表和B表的增量差异其实是包含三部分内容:1)数据在A表中存在,在B表中不存在;2)数据在A表、B表都存在且内容不一样;3)数据在A表中不存在,在B表中存在。由此,生成模块20可将获取到的当前最新全量数据与次新全量数据进行增量差异对比,得到当前最新全量数据与次新全量数据之间具有数据差异的部分内容作为增量数据。
导入模块30可用于将增量数据导入至次新全量数据。可以理解,由于当前有效全量数据正在被线上应用使用,所以当前最新全量数据相对于当前有效全量数据而言,当前最新全量数据为离线数据,因此可以理解,增量数据也为离线的数据。在本申请的实施例中,导入模块30可通过数据同步工具将增量数据导入至次新全量数据。其中,数据同步工具可包括但不限于Datax工具、DBSync工具等。
例如,以数据同步工具为Datax工具为例,也就是说,导入模块30将增量数据导入线上数据库(如Mysql数据库)表的实现方式可以是通过Datax工具来实现,其中,Datax工具导入数据的基本思路可如图2所示:可读取Datax配置,并根据Datax配置获取大数据平台中所包含的所有具体表和分区,之后,可通过Datax配置获取目标Mysql库和目标表A_0或者A_1表,然后,读入大数据平台表及分区数据(实际上式数据文件),最后,通过Java JdbC工具以Mysql Replace方式将数据写入具体表中。
切换模块40可用于根据当前有效全量数据和导入后的次新全量数据进行版本切换。具体而言,在本申请的实施例中,切换模块40根据当前有效全量数据和导入后的次新全量数据进行版本切换的具体实现过程可如下:将导入后的次新全量数据作为新的当前有效全量数据,并将当前有效全量数据作为新的次新全量数据。更具体地,在导入模块30增量数据导入到次新全量数据之后,切换模块40可对当前有效全量数据所在表和导入后的次新全量数据所在表进行版本切换,也就是说,切换模块40将导入后的次新全量数据所在表作为当前有效版本,以用于在线应用提供服务,并将原当前有效全量数据所在表作为历史有效版本,以备份且用于下次导数据时作为待导入表。
进一步的,在本申请的一个实施例中,如图5所示,该数据导入装置还可以包括:更新模块50,更新模块50可用于在切换模块40根据当前有效全量数据和导入后的次新全量数据进行版本切换的同时,分别更新版本表中的第一状态、第二状态和第三状态所对应的状态值。更具体地,当切换模块40将导入后的次新全量数据作为新的当前有效全量数据,并将原当前有效全量数据作为新的次新全量数据以完成版本的切换的同时,更新模块50可在版本表中,将导入后的次新全量数据所对应的状态值从第二状态变为第三状态,并将原当前有效全量数据所对应的状态值从第三状态变为第一状态,以实现版本表中所包含的表的状态进行更新。
需要说明的是,本申请实施例的数据导入装置由于是交替式增量导数据,所以在任务开始之初的第1、第2次导数据任务时,其实都是全量数据进行导入的,只有在第3次导数据时,才可以理解为增量方式的导数据。具体地,当离线产生增量数据的任务时,一定要先判断当前导数据任务是第1次、第2次还是第3次。例如,假如第1次导入线上的数据是biz_date-2,第2次导入的数据是biz_date-1,那么当前导入的数据biz_date-0应该是全量biz_date-0所在表跟biz_date-2所在表之间的增量,并将该增量导入到biz_date-2的表上。
下面将举例说明导数据的实现过程:假设大数据分析平台的数据,按每天一份全量保存,所以将一天的数据叫做一个分区,并假设大数据分析平台数据从2015-05-01开始每天产生一份A表全量数据,目前要将A表导入线上Mysql数据库提供给应用使用,假设线上有A_0、A_1两张表,如图3(a)所示,由于线上Mysql数据库是第一天开始导数据,所以导数据之前,Mysql数据库中的A_0表和A_1表中的数据均为空,所以,将当前最新数据(即2015-05-01这天所产生的全部数据)全部倒入线上A_0表中,此时,A_0表中的数据作为当前有效全量数据。如图3(b)所示,当将第二天(即2015-05-02)产生的全部数据进入导入时,由于目前A_1表中的数据为空,所以,可将第二天(即2015-05-02)产生的全部数据导入到线上A_1表中,此时,将A_1表中的数据作为当前有效全量数据,A_0表中的数据作为次新全量数据。如图3(c)所示,当第三天导数据时,需要将增量数据导入A_0表中,但是A_0表中已经存在2015-05-01的数据,所以需要对A_0表中的数据进行增量计算,即2015-05-03的增量数据=2015-05-03所具有的全量数据与2015-05-01的全量数据进行比较,之后将计算结果导入A_0表中,同时可认为A_0表就是当前2015-05-03的全量数据。
还需要说明的是,在本申请的实施例中,如果出现导入生产的数据存在问题,则可根据版本表将当前有效表切换为之前设置为历史有效表(即次新全量数据所在表),即将之前设置为历史有效表作为当前有效表,这是因为之前确保了历史次新全量数据是真实且有效,由此,可以降低数据风险,减少问题的扩大。
本申请实施例的数据导入装置,可通过获取模块访问版本表,并根据版本表获取当前有效全量数据和次新全量数据,生成模块获取当前最新全量数据,并根据当前最新全量数据和次新全量数据生成增量数据,导入模块将增量数据导入至次新全量数据,切换模块根据当前有效全量数据和导入后的次新全量数据进行版本切换,即通过引入当前有效全量数据所在表和次新全量数据所在表的概念,并通过版本表根据交替式增量导数据的思想,保证了批量到数据表和在线服务的表不是同一张表,解决了现有技术中读写同一张表所存在的一些缺陷的问题,如通过不同表的切换,避免了在读写数据并存时限制导数据并发量的现象,从而提高了数据的导入效率。
在本申请的描述中,需要理解的是,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本申请的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本申请的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本申请的实施例所属技术领域的技术人员所理解。
在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,"计算机可读介质"可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPROM或闪速存储器),光纤装置,以及便携式光盘只读存储器(CDROM)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
应当理解,本申请的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本申请各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。
上述提到的存储介质可以是只读存储器,磁盘或光盘等。
尽管上面已经示出和描述了本申请的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本申请的限制,本领域的普通技术人员在本申请的范围内可以对上述实施例进行变化、修改、替换和变型。