背景技术
数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库是为企业所有级别的决策制定过程提供支持的所有类型数据的战略集合。其数据来自于各个分散的源数据库,例如生产环境下的关系数据库,以及其他需要进行分析的数据所在的数据库。数据仓库是出于分析性报告和决策支持的目的而创建,为企业提供需要业务智能来指导业务流程改进和监视时间、成本、质量和控制。与源数据库相比,数据仓库是前者数据的汇总,具有大容量的特点,并且一般有大量的查询操作,但修改和删除操作很少,通常只需要定期的加载、刷新。
在搭建数据仓库系统,建设数据分析平台时,常常需要实时的数据流参与数据分析,如PV(页面浏览量)、UV(独立访问量)、订单量、订单金额等,因此要求能够快速准确的得到实时数据。
数据仓库的数据是从源数据库抽取数据而得到。数据抽取的时间间隔一般由最终用户的查询数据的需求决定,大多数需求一般是一天至少更新一次数据。如果源数据库是随时会有更新的在线数据库,则数据仓库可以在源数据库在线或离线时抽取数据,一般按如下步骤:
步骤一:使用数据库SQL查询的方式获取源数据库在一定时间范围内更新的数据。一般根据数据表更新字段获取每天更新的数据,如果没有更新字段则需要进行每天全表查询抽取。
步骤二:将第一步获取的数据通过程序或者数据库原生方式从源数据库导入到中转服务器或者数据仓库。
步骤三:经过数据清洗后的当天增量或者全量数据保存到数据仓库的源数据库的镜像数据库内,并且生成该镜像数据在当天的一个快照数据。
按照现有技术中的上述从源数据库离线批量抽取数据方式,由于离线批量抽取只能采用SQL方式通过数据库查询引擎进行数据提取,会对源数据库造成一定压力。为了减少对源数据库的压力,从源数据库进行数据抽取一般都在每天夜间生产压力小的时候进行,从而造成了数据至少一天的延时,并且只能通过抽取大于每次间隔时间的数据来更新。这样,从数据仓库查询得到的数据比较陈旧,时效性不足。
发明内容
有鉴于此,本发明提供一种应用于数据仓库的数据处理方法和数据处理装置,能够提高数据仓库中的数据的时效性。
为实现上述目的,根据本发明的一个方面,提供了一种应用于数据仓库的数据处理方法。
本发明的应用于数据仓库的数据处理方法包括:在第一数据库被操作时,根据该操作对应的增量日志对数据仓库中的第一数据库的镜像数据库的记录进行修改,然后将修改后的记录另行保存到键值数据库中;从所述键值数据库中取出最新的条目,将该条目追加保存到所述数据仓库的第一数据表中,使该第一数据表中包含所述镜像数据库的该记录的各个历史版本;在所述第一数据表中查询数据。
可选地,在所述第一数据表中查询数据的步骤包括:在所述第一数据表中查询具有指定标识并且距指定历史时刻最近且在该历史时刻之前更新的数据库记录。
可选地,在所述第一数据表中查询数据的步骤包括:在所述第一数据表中查询当前最新的记录。
可选地,还包括:根据所述第一数据表的指定时刻之前的记录,将当前数据仓库的第一数据库的镜像数据库更新为所述第一数据库在该指定时刻的状态。
可选地,所述键值数据库为Hbase数据库;所述第一数据表为Hive数据表。
根据本发明的另一方面,提供了一种应用于数据仓库的数据处理装置。
本发明的应用于数据仓库的数据处理装置包括:修改模块,用于在第一数据库被操作时,根据该操作对应的增量日志对数据仓库中的第一数据库的镜像数据库的记录进行修改,然后将修改后的记录另行保存到键值数据库中;保存模块,用于从所述键值数据库中取出最新的条目,将该条目追加保存到所述数据仓库的第一数据表中,使该第一数据表中包含所述镜像数据库的该记录的各个历史版本;查询模块,用于在所述第一数据表中查询数据。
可选地,所述查询模块还用于在所述第一数据表中查询具有指定标识并且距指定历史时刻最近且在该历史时刻之前更新的数据库记录。
可选地,所述查询模块还用于在所述第一数据表中查询当前最新的记录。
可选地,还包括更新模块,用于根据所述第一数据表的指定时刻之前的记录,将当前数据仓库的第一数据库的镜像数据库更新为所述第一数据库在该指定时刻的状态。
可选地,所述键值数据库为Hbase数据库;所述第一数据表为Hive数据表。
根据本发明的技术方案,在第一数据库被操作时,根据该操作对应的增量日志对数据仓库中的第一数据库的镜像数据库的记录进行修改,修改后的条目的内容被追加保存到数据仓库的第一数据表中,使该第一数据表中包含镜像数据库的该记录的各个历史版本,这样既能够从数据仓库中得到实时性很高的镜像数据,又可以得到镜像数据库在任意历史时刻的版本即数据快照,还能够使镜像数据库的更新调度变得简单,调度间隔容易控制。在Hadoop技术环境下,应用本实施例的方案无需编写复杂的Mapreduce程序,通过Hive SQL接口就可以从第一数据表中查询数据记录以及更新上述镜像数据库。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
在以下的描述中,以数据仓库保存生产环境下的在线的关系数据库(以下简称作“第一数据库”)的镜像数据库为例说明本实施例的技术方案对本发明实施例的技术方案作详细说明,并且本实施例中采用Hadoop体系的技术。图1是根据本发明实施例的应用于数据仓库的数据处理方法的流程的主要步骤的示意图。该方法可以由计算机程序来完成。如图1所示,该方法主要包括如下的步骤S11至S13。
步骤S11:判断当前是否产生增量日志。若是,则进行步骤S12,否则延时之后再次判断。在第一数据库被操作后,日志处理程序监听到数据库的变化,然后产生一条对应于该操作的日志,该日志对于第一数据库来说可以称作“操作日志”,对于第一数据库的镜像数据库来说可称作增量日志。
步骤S12:根据步骤S11中获取的增量日志,对数据仓库中的第一数据库的镜像数据库的记录进行修改。显然这里的记录应当是增量日志涉及到的记录。
步骤S13:将步骤S12中被修改的记录另行保存到键值数据库中。由于源数据库可能是在线数据库,其数据更新速度可能非常快,因此需要采用能够快速读写数据记录的数据库来缓存修改后的数据记录,本实施例中采用了键值数据库例如Hbase等。以数据记录的标识(在下文中的各表中,标识是其中的id字段)为键名,数据记录的其他字段为键值进行保存,在保存时先判断键值数据库中是否已经有以该被修改的记录的标识为键名的记录,如没有,则直接保存该被修改的记录,如果有,则按该被修改的记录的内容更新已有的记录。也就是说在键值数据库中,仅保存第一数据库的各条记录的最新版本。这样,如果需要查询某一记录的最新版本,可以从该键值数据库中以最快的速度获取,无需对第一数据库进行操作。
步骤S14:从该键值数据库中取出最新条目,将该条目追加保存到数据仓库的第一数据表中。
在Hadoop体系下,可采用应用于Hadoop的数据仓库工具Hive将结构化的数据文件映射得到上述第一数据表。可按键名快速取出Hbase中的数据记录,然后由Hive进行映射处理得到Hive表。Hive表是一种数据库表,提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务来运行。
对于数据仓库中的第一数据库的镜像数据库,并不在上述步骤中被更新,也就是说上述步骤与第一数据库的镜像数据库的更新,二者独立进行。
步骤S14之后返回步骤S11。按照上述步骤,第一数据表中逐渐累计了第一数据库的各条记录的每次更新后的版本。以下举一个具体的例子。例如在2014年4月1日0:45得到表1包含的日志内容(表1中是日志的内容,而实际的日志形式不一定是表格形式):
表1
该日志记录的是第一数据库中插入了一条新记录的操作,其中的字段dml_opt_type表示操作类型,insert表示该记录是被新插入到第一数据库中,update表示该记录被修改(即更新),delete表示该记录被删除。字段version是在日志被保存时分配的按自然数单调递增的版本号。字段delete为1表示该记录在第一数据库中存在,为0表示在第一数据库中不存在(即已被删除)。在键值数据库中,保存的内容如表2所示(表2是键值数据库中的数据的内容,键值数据库并不以表格形式保存数据):
表2
id |
order |
name |
price |
dml_opt_type |
version |
lastupdatetime |
delete |
1 |
1001 |
kate |
0 |
insert |
1 |
2014/4/10:45 |
1 |
随着时间的推移,依次获取到后续产生的日志,如表3所示。表3内示出了已获得的一条日志的内容。
表3
每获取到一条日志,就修改一次镜像数据库中的相应记录然后保存到键值数据库中,此时可以根据逻辑关系补全所有字段。键值数据库中的最新记录以追加保存的方式另存到第一数据表内,即不覆盖第一数据表内具有与被修改记录相同id的记录的原有内容。追加保存使得第一数据表内出现同一id的记录有多条的情况,如表4所示。表4还保存了数据记录的操作方式。
表4
id |
order |
name |
price |
dml_opt_type |
version |
lastupdatetime |
delete |
1 |
1001 |
kate |
0 |
insert |
1 |
2014/4/1 0:45 |
1 |
2 |
1002 |
tom |
1 |
insert |
2 |
2014/4/1 0:57 |
1 |
3 |
1003 |
leo |
12.1 |
insert |
3 |
2014/4/1 1:57 |
1 |
4 |
1004 |
jack |
9.1 |
insert |
4 |
2014/4/1 1:57 |
1 |
5 |
1005 |
joy |
|
insert |
5 |
2014/4/1 2:19 |
1 |
5 |
1005 |
joy |
10 |
update |
6 |
2014/4/1 2:29 |
1 |
2 |
1002 |
tom |
1 |
update |
7 |
2014/4/2 4:10 |
1 |
4 |
1004 |
jack |
9.1 |
delete |
8 |
2014/4/2 8:10 |
0 |
因为在第一数据库被更新时,实时产生增量日志,而执行上述各步骤之后,第一数据表中包含了按照该增量日志修改后的数据记录,因此使得第一数据表中的记录有很高的更新程度,而且还包含了条记录的各个历史版本。采用通用的SQL语句可以从第一数据表中查询最新的数据记录;还可以针对指定的历史时刻进行查询,例如编写如下的SQL语句:
select*from(select max(version)as version,distinct(id)asid,order,name,price,date,delete from A_middle where lastUpdateTime<='2014/04/03 12:10'and delete=1)
在上面的SQL语句中,通过lastUpdateTime<='2014/04/03 12:10指定了历史时刻,通过max(version)函数取version值最大值,使查询到的记录距离历史时刻最近,通过delete=1指定记录未被删除,通过distinct(id)指定了id字段并进行去重,这样最终查询到在指定历史时刻之前并距离该历史时刻最近的指定标识的数据记录。
因为第一数据表中保存了数据记录的增量,所以也可以用来与数据仓库中的第一数据库的镜像数据库进行合并从而对该镜像数据进行更新。这样,在存在第一数据表的情况下,可以简化对于上述镜像数据库进行更新时的调度机制,利用第一数据表来更新该镜像数据库。例如当前该镜像数据库是更新到2014/4/1 0:00,则可以根据表4的内容对其进行更新。可以是按表4所示的全部内容更新到2014/4/2 8:10,也可以指定一个时刻,例如2014/4/2 0:00,这样就按表3中的前6行更新镜像数据库,即更新到指定时刻之前的记录,这里的“之前”包含指定时刻本身,例如指定时刻是2014/4/1 2:19,则根据表3前5行更新镜像数据库。这样,在该指定时刻,镜像数据库与第一数据库本身的状态相同,也就是说能够得到任意时刻的第一数据库的数据镜像。
图2是根据本发明实施例的应用于数据仓库的数据处理装置的主要模块的示意图。该装置可以用计算机软件来实现。如图2所示,数据处理装置20主要包括修改模块21、保存模块22、以及查询模块23。
修改模块21用于在第一数据库被操作时,根据该操作对应的增量日志对数据仓库中的第一数据库的镜像数据库的记录进行修改,然后将修改后的记录另行保存到键值数据库中。保存模块22用于从键值数据库中取出最新的条目,将该条目追加保存到数据仓库的第一数据表中,使该第一数据表中包含镜像数据库的该记录的各个历史版本。查询模块23用于在第一数据表中查询数据,可根据用户的查询指令,在第一数据表中查询具有指定标识并且距指定历史时刻最近且在该历史时刻之前更新的数据库记录,还可以在第一数据表中查询当前最新记录。
数据处理装置20还可包括更新模块(图中未示出),用于根据第一数据表的指定时刻之前的记录,将当前数据仓库的第一数据库的镜像数据库更新为第一数据库在该指定时刻的状态。
根据本发明实施例的技术方案,在第一数据库被操作时,根据该操作对应的增量日志对数据仓库中的第一数据库的镜像数据库的记录进行修改,修改后的条目的内容被追加保存到数据仓库的第一数据表中,使该第一数据表中包含镜像数据库的该记录的各个历史版本,这样既能够从数据仓库中得到实时性很高的镜像数据,又可以得到镜像数据库在任意历史时刻的版本即数据快照,还能够使镜像数据库的更新调度变得简单,调度间隔容易控制。在Hadoop技术环境下,应用本实施例的方案无需编写复杂的Mapreduce程序,通过Hive SQL接口就可以从第一数据表中查询数据记录以及更新上述镜像数据库。
以上结合具体实施例描述了本发明的基本原理,但是,需要指出的是,对本领域的普通技术人员而言,能够理解本发明的方法和设备的全部或者任何步骤或者部件,可以在任何计算装置(包括处理器、存储介质等)或者计算装置的网络中,以硬件、固件、软件或者它们的组合加以实现,这是本领域普通技术人员在阅读了本发明的说明的情况下运用他们的基本编程技能就能实现的。
因此,本发明的目的还可以通过在任何计算装置上运行一个程序或者一组程序来实现。所述计算装置可以是公知的通用装置。因此,本发明的目的也可以仅仅通过提供包含实现所述方法或者装置的程序代码的程序产品来实现。也就是说,这样的程序产品也构成本发明,并且存储有这样的程序产品的存储介质也构成本发明。显然,所述存储介质可以是任何公知的存储介质或者将来开发出的任何存储介质。
还需要指出的是,在本发明的装置和方法中,显然,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本发明的等效方案。并且,执行上述系列处理的步骤可以自然地按照说明的顺序按时间顺序执行,但是并不需要一定按照时间顺序执行。某些步骤可以并行或彼此独立地执行。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。