一种数据抽取方法及装置
文献发布时间:2023-06-19 11:05:16
技术领域
本发明涉及数据处理技术领域,尤其涉及一种数据抽取方法及装置。
背景技术
大数据时代的到来改变了人们的生活方式、思维模式和研究范式,在大数据时代,数据不仅是一种“资源”,更是一种重要的“资产”。因此,数据科学应把数据当作一种“资产”来管理,而不能仅仅当作“资源”来对待。也就是说,与其他类型的资产相似,数据也具有财务价值,且需要作为独立实体进行组织与管理。面对众多的数据源,由于数据来源广泛,使得多样性成为了大数据的重要特点之一。大数据的数据类型复杂,也就意味着这种复杂的数据环境将给大数据的处理带来极大的挑战。因此要想处理大数据,必须先对所需的数据源的数据进行抽取和集成,从中提取出数据的实体和关系,经过关联和聚合之后,再采用统一定义的结构来存储这些数据。在对数据进行集成和提取时,需要对数据进行清洗,保证数据质量及可信度。由此可见,数据抽取作为数据处理的第一步,具有至关重要的作用。
但是,利用ETL抽取工具进行抽取数据的过程中,需要额外使用脚本去做一些清洗功能,对于一些现场运维人员来说,他们对脚本不是很熟悉,所以当需要手写脚本去进行数据清洗就显得很有难度。
发明内容
本发明的主要目的在于提出一种数据抽取方法及装置,以解决现有技术中使用ETL抽取工具进行数据抽取,需要额外编写脚本进行数据清洗,对现场运维人员的要求高,从而使得现场运维人员的工作难度大的问题。
为实现上述目的,本发明实施例第一方面提供一种数据抽取方法,包括:
执行数据抽取任务,所述数据抽取任务包括在源表中抽取数据,并创建临时表,其中,所述临时表关联自定义数据清洗语句,所述源表执行查询语句,且将查询结果集写入所述临时表;
利用所述自定义数据清洗语句对写入了查询结果集的临时表进行数据清洗;
根据所抽取的数据的写入方式,将清洗后的临时表写入目标表。
结合本发明第一方面,本发明第一实施方式中,利用所述自定义数据清洗语句对写入了查询结果集的临时表进行数据清洗,包括:
在所述源表中抽取数据时,若未抽取到时间字段,则在对写入了查询结果集的临时表进行数据清洗时,在所述自定义数据清洗语句中写入第一标志字段,所述第一标志字段包括时间类型。
结合本发明第一方面,本发明第二实施方式中,利用所述自定义数据清洗语句对写入了查询结果集的临时表进行数据清洗,包括:
在所述源表中抽取数据时,若抽取到时间字段,则在所述自定义数据清洗语句中写入第二标志字段,所第二标志字段包括时间字段转换语句。
结合本发明第一方面第二实施方式,本发明第三实施方式中,在所述自定义数据清洗语句中编辑时间字段转换语句,包括:
保留所述时间字段中,预设长度的字符;
或者,
格式化所述时间字段,获得格式化字符串形式的时间。
结合本发明第一方面第一实施方式至第三实施方式,本发明第四实施方式中,根据所抽取的数据的写入方式,将清洗后的临时表写入目标表之后,包括:
对写入清洗后的临时表后的目标表进行二次清洗;
所述二次清洗包括清洗目标表中创建时间在预设日期以前的历史数据、清洗目标表中错误数据、日期越界的数据、数值不符合常识的数据中的至少一种。
结合本发明第一方面,本发明第五实施方式中,执行数据抽取任务时,在源表中抽取数据,并创建临时表之前,包括:
识别当前数据抽取任务类型;
所述数据抽取任务类型为全量抽取时,若使用强制抽取的方式抽取数据,则在强制抽取成功时,利用强制抽取的数据作为当前使用的源表,并创建所述临时表;
若未使用强制抽取方式抽取数据,则检测当前使用的源表是否更新,并在所述当前使用的源表更新时,创建所述临时表;
所述数据抽取任务类型为增量抽取时,清空失败的数据抽取历史,检测当前使用的源表是否更新,若所述当前使用的源表更新,则创建所述临时表;
或者,
利用数据抽取成功后所抽取的数据作为当前使用的源表,检测当前使用的源表是否更新,若所述当前使用的源表更新,则创建所述临时表,其中,所述数据抽取历史包括历史临时表及所述历史临时表中的数据。
结合本发明第一方面第五实施方式,本发明第六实施方式中,所述数据抽取任务类型为全量抽取时,检测当前使用的源表是否更新,包括:
所述当前使用的源表记录在同步信息离线表中;
从所述同步信息离线表获取时间上与所述当前使用的源表相邻的所述数据抽取任务记录,将其抽取开始时间记为第一参考时间戳;
获取所述当前使用的源表的更新时间,将所述更新时间记为第二参考时间戳;
若所述第一参考时间戳小于所述第二参考时间戳,则所述当前使用的源表更新;
若从所述同步信息离线表未获取到时间上与所述当前使用的源表相邻的所述数据抽取任务记录,则查询所述当前使用的源表的数据量,以及所述目标表的数据量,并且,所述当前使用的源表的数据量与所述目标表的数据量不相等,或者所述目标表的数据量为0时,所述当前使用的源表更新。
结合本发明第一方面第五实施方式,本发明第七实施方式中,所述数据抽取任务类型为增量抽取时,检测当前使用的源表是否更新,包括:
获取所述目标表的第一更新标志字段最大值,根据所述第一更新标志字段最大值设置下限值,其中,下限值=更新标志字段最大值+1;
获取所述当前使用的源表的第二更新标志字段最大值,将所述第二更新标志字段最大值设置为上限值;
所述下限值小于或者等于所述上限值时,所述当前使用的源表更新。
结合本发明第一方面第五实施方式至第七实施方式,本发明第八实施方式中,所述数据抽取任务类型为增量抽取时,还创建存储过程;
所述数据抽取任务类型为增量抽取,且执行数据抽取任务时,调用所述存储过程,并在所述存储过程中利用所述自定义数据清洗语句对写入了查询结果集的临时表进行数据清洗。
本发明实施例第二方面提供一种数据抽取装置,包括:
数据抽取任务执行模块,用于执行数据抽取任务,所述数据抽取任务包括在源表中抽取数据,并创建临时表,其中,所述临时表关联自定义数据清洗语句,所述源表执行查询语句,且将查询结果集写入所述临时表;
数据清洗模块,用于利用所述自定义数据清洗语句对写入了查询结果集的临时表进行数据清洗;
目标表写入模块,用于根据所抽取的数据的写入方式,将清洗后的临时表写入目标表。
本发明实施例提出一种数据抽取方法,借助临时表执行数据抽取任务,数据清洗在临时表中进行,最后将清洗后的临时表写入目标表,完成数据抽取。其中,临时表关联自定义数据清洗语句,则通过编辑自定义数据清洗语句,可以对临时表进行功能上的改动,从而对各种不同的源表中的数据进行抽取、清洗以及写入,进而降低现场运维人员的工作难度。
附图说明
图1为本发明实施例提供的数据抽取方法的实现流程示意图;
图2为本发明实施例提供的数据抽取装置的组成结构示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
需要说明的是,在本文中,术语“包括”、“包含”或者任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
在本文中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明的说明,其本身并没有特定的意义。因此,"模块"与"部件"可以混合地使用。
如图1所示,本发明实施例提供了一种数据抽取方法,包括但不限于如下步骤:
S101、执行数据抽取任务,所述数据抽取任务包括在源表中抽取数据,并创建临时表;
其中,所述临时表关联自定义数据清洗语句,所述源表执行查询语句,且所述源表执行查询语句后的查询结果集写入所述临时表。
本发明实施例中,上述步骤S101中的自定义数据清洗语句为用户自定义编写的,针对临时表的清洗SQL语句组。则面对不同的数据抽取任务,以及不同的数据清洗需求,编写对应的SQL语句作为数据清洗语句即可,以使执行数据抽取任务的过程自动化,不再需要人为去手动执行清洗。
S102、利用所述自定义数据清洗语句对写入了查询结果集的临时表进行数据清洗。
S103、根据所抽取的数据的写入方式,将清洗后的临时表写入目标表。
在上述步骤S103中,不同的数据抽取任务类型具有不同的写入方式。在本发明实施例中,数据抽取任务类型包括全量抽取和增量抽取。
其中,为全量抽取时,写入方式包括覆盖和追加;覆盖表示用清洗后的临时表替换目标表,追加表示将清洗后的临时表合并到目标表。为增量抽取时,写入方式为合并,表示将清洗后的临时表合并到目标表。
在上述步骤S101至步骤S103中,由于临时表关联自定义数据清洗语句,则在临时表中可以进行多种清洗方式,清洗方式由自定义数据清洗语句确定,因此,通过对临时表进行功能上的改动,可以对各种不同的源表中的数据进行抽取、清洗以及写入,从而降低现场运维人员的工作难度。
在一个实施例中,执行上述步骤S101至步骤S103时,会伴随着在同步信息在线表中记录抽取执行过程中的实时数据,如抽取开始时间,结束时间,抽取结果等,上述步骤S101至步骤S103执行完毕后,则将同步信息在线表中的记录最后同步到同步信息离线表中存储,并删除同步信息在线表中的记录。。
本发明实施例提供的数据抽取方法,将在源表中抽取到的数据,先写入到临时表,再进行数据清洗,最后合并到目标表,或者替换目标表,避免了在将源表中抽取到的数据直接抽取到目标表时,抽取一开始发生错误或抽取过程中抽取失败对目标表所造成的影响,具体为导致目标表中具有错误的数据、残缺的数据、多次失败造成的重复数据等。此外,在传统的数据抽取方式中,即使在将源表中抽取到的数据直接抽取到目标表的过程中没有错误出现,后续的对目标表进行清洗时,也可能出现错误,其中,如果清洗出错了,仍然可能导致目标表中有错误的数据、残缺的数据等。
在本发明实施例中,还示例性地示出了三种自定义数据清洗语句,以说明上述步骤S102的实现,但在具体应用中,临时表关联的自定义数据清洗语句包括但不限于本发明实施例示出的三种自定义数据清洗语句。
在一个实施例中,上述步骤S102包括:
在所述源表中抽取数据时,若未抽取到时间字段,则在对写入了查询结果集的临时表进行数据清洗时,在所述自定义数据清洗语句中写入第一标志字段,所述第一标志字段包括时间类型。
在具体应用中,对于一些数据源,可能无法抽取到时间字段,这是由于数据源中既没有类似于主键这样的自增长字段,也没有表示时间形式的字段,因此,很难通过字段的值去区分某一部分的数据到底是来自于大概哪个时间段的抽取的数据。基于此,本发明实施例中,通过在自定义数据清洗语句中写入第一标志字段,以使临时表给目标表新增第一标志字段,其中,第一标志字段包括时间类型。则第一标志字段可以表示执行数据抽取任务的某次抽取过程中,源表的数据被抽取到目标表中的时间。
本发明实施例还示例性的示出了在实际应用中,上述步骤的自定义数据清洗语句的编写,即与“写入第一标志字段”对应的SQL语句的编写,为:
filter_sql_num=1
filter_sql0=”update rjryxx set rksj=now()”
其中,rjryxx为目标表名,rksj则为新增的第一标志字段,为时间类型的字段,它的值为执行sql语句的当前时间。由于该字段的值与执行SQL时的当前时间有关,因此不同时间时的抽取,其值是不一样的,通过这个值,我们可以知道某某数据是哪个时间段抽取的。
在另一实施例中,上述步骤S102包括:
在所述源表中抽取数据时,若抽取到时间字段,则在所述自定义数据清洗语句中写入第二标志字段,所述第二标志字段包括时间字段转换语句。
其中,在所述自定义数据清洗语句中编辑时间字段转换语句,包括:
保留所述时间字段中,预设长度的字符;
或者,
格式化所述时间字段,获得格式化字符串形式的时间。
在具体应用中,源表中可以抽取到时间字段,但时间字段的表现形式可能仅包含“年月日和时分”,即不包括“秒”;也可能仅需包含“年月日”,即只包含日期,而不包括“时分秒”。
此外,时间字段的存储形式也具有多样化,例如,源表中时间字段的存储形式是时间戳,即使用类似INT(11)、BIGINT等这样的类型存储的时间,但是抽取到目标表中后,不想使用原始的时间戳数据,则目标表中的时间字段存储形式和在源表中时的存储形式不同。
因此,需要对抽取到的时间字段进行处理。在本发明实施例中,通过在自定义数据清洗语句中写入第二标志字段,第二标志字段包括时间字段转换语句,从而在将抽取的数据正式写入到目标表之前,做到时间字段转换的数据清洗效果,时间字段转换包括统一时间字段格式或时间字段存储形式。
本发明实施例示例性的示出了上述第二标志字段的一种SQL语句,为:
filter_sql_num=6
filter_sql0=”update t_chrec_new_p_allnew setltime=str_to_date(substring(source_ltime,1,12),'%Y%m%d%H%i')”
filter_sql1=”update t_chrec_new_p_allnew setrtime=str_to_date(substring(source_rtime,1,12),'%Y%m%d%H%i')”
filter_sql2=”update t_chrec_new_p_allnew setodate=str_to_date(substring(source_odate,1,8),'%Y%m%d')”
filter_sql3=”update t_chrec_new_p_allnew setcreatetime=str_to_date(substring(source_createtime,1,12),'%Y%m%d%H%i')”
filter_sql4=”update t_chrec_new_p_allnew setinputtime=str\_to_date(substring(source_inputtime,1,12),'%Y%m%d%H%i')”
filter_sql5=”update t_chrec_new_p_allnew setrksj=str_to_date(substring(source_rksj,1,12),'%Y%m%d%H%i')”
其中,抽取到目标表后,对于ltime、rtime、createtime、inputtime和rksj等字段,对字段的清洗为“保留年月日时分,取前12个字符”,而对于odate字段,由于不关心整体时间的具体时间的时分秒,因此对odate字段的清洗为“保留年月日,取前8个字符”。
本发明实施例示例性的示出了上述第二标志字段的另一SQL语句,为:
filter_sql_num=2
filter_sql0="update wjjdsj set capturetime=from_unixtime(capturetime)"
filter_sql1="update wjjdsj set signtime=from_unixtime(signtime)"
上述的自定义清洗语句中,它将wjjds表中的capturetime字段和signtime字段的值都做了相应的转换,即时间戳转换成格式化字符串形式。
基于上述的数据抽取方法,在本发明实施例中,还对写入清洗后的临时表后的目标表再次进行数据清洗,即上述步骤S103之后,还包括对写入清洗后的临时表后的目标表进行二次清洗;所述二次清洗包括清洗目标表中创建时间在预设日期以前的历史数据、清洗目标表中错误数据、日期越界的数据、数值不符合常识的数据中的至少一种。
在本发明实施例中,源表和目标表均为关系数据库,因此,执行数据抽取任务时,通常采用两种抽取方式,分别为全量抽取和增量抽取,则上述步骤S101之前,即执行数据抽取任务时,在源表中抽取数据,并创建临时表之前,包括如下步骤:
识别当前数据抽取任务类型;
所述数据抽取任务类型为全量抽取时,若使用强制抽取的方式抽取数据,则在强制抽取成功时,利用强制抽取的数据作为当前使用的源表,并创建所述临时表;
若未使用强制抽取方式抽取数据,则检测当前使用的源表是否更新,并在所述当前使用的源表更新时,创建所述临时表;
所述数据抽取任务类型为增量抽取时,清空失败的数据抽取历史,检测当前使用的源表是否更新,若所述当前使用的源表更新,则创建所述临时表;
或者,
利用数据抽取成功后所抽取的数据作为当前使用的源表,检测当前使用的源表是否更新,若所述当前使用的源表更新,则创建所述临时表,其中,所述数据抽取历史包括历史临时表及所述历史临时表中的数据。
在具体应用中,全量抽取类似于数据迁移或数据复制,通过全量抽取,将数据源,即将源表中的表数据或视图数据原封不动的抽取出来,再写入到目标表中,适用于对于数据量不是很大的情况。增量抽取用于抽取自前次抽取以后,源表新增、修改、删除的数据。
因此,在本发明实施例中,根据数据抽取任务类型的不同采用不同的数据抽取方式。且尤其在数据抽取任务类型为增量抽取时,本发明实施例提供的数据抽取方法可以实现“断点续传”。
其中,“断点续传”的实现原理如下:
假设抽取周期为一天,那么就是一天抽取一次数据到目标表。随着时间的推移,以及源表的数据不断地更新或者增加,抽取到目标表的数据会越来越多。当某次抽取到临时表失败时,不管是抽取到临时表失败,还是数据清洗失败,还是合并数据失败,此次抽取的数据都不会真正地写到目标表,而抽取到的临时表的数据也会删除,这样就保证了每次抽取到目标表的数据都是有效的数据,抽取中间出错的数据一般都不会写到目标表,而是被丢弃。此处抽取出错的地方就是我们所说的“断点”,当需要重抽该数据时,或者到了下次的抽取周期后,它就会根据“断点”,从这个“断点”处继续尝试抽取,直至最终写入到目标表。
则上述步骤中,所述数据抽取任务类型为全量抽取时,检测当前使用的源表是否更新,包括:
所述当前使用的源表记录在同步信息离线表中;
从所述同步信息离线表获取时间上与所述当前使用的源表相邻的所述数据抽取任务记录,将其抽取开始时间记为第一参考时间戳;
获取所述当前使用的源表的更新时间,将所述更新时间记为第二参考时间戳;
若所述第一参考时间戳小于所述第二参考时间戳,则所述当前使用的源表更新;
若从所述同步信息离线表未获取到时间上与所述当前使用的源表相邻的所述数据抽取任务记录,则查询所述当前使用的源表的数据量,以及所述目标表的数据量,并且,所述当前使用的源表的数据量与所述目标表的数据量不相等,或者所述目标表的数据量为0时,所述当前使用的源表更新。
可见,全量抽取中,通过源表的更新时间,以及源表和目标表的数据量对比,可以判断出当前使用的源表是否更新。
则上述步骤中,所述数据抽取任务类型为增量抽取时,检测当前使用的源表是否更新,包括:
获取所述目标表的第一更新标志字段最大值,根据所述第一更新标志字段最大值设置下限值,其中,下限值=更新标志字段最大值+1;
获取所述当前使用的源表的第二更新标志字段最大值,将所述第二更新标志字段最大值设置为上限值;
所述下限值小于或者等于所述上限值时,所述当前使用的源表更新。
可见,增量抽取中,需要将源表和目标表进行对比,分析通过两个更新标志字段判断出当前使用的源表是否更新。
在一个实施例中,所述数据抽取任务类型为增量抽取时,还创建存储过程;则所述数据抽取任务类型为增量抽取,且执行数据抽取任务时,调用所述存储过程,并在所述存储过程中利用所述自定义数据清洗语句对写入了查询结果集的临时表进行数据清洗。
在具体应用中,随着增量抽取的时间推移,在将清洗后的临时表写到目标表之前,可能会执行两条或者两条以上的自定义数据清洗语句,因此,增量抽取时,创建存储过程和调用存储过程十分必要。
本发明实施例示例性的示出了上述创建和调用存储过程的SQL语句,为:
filter_sql_num=1
filter_sql0="call t_bs_wp_bdq_djb_qg()"
其中,t_bs_wp_bdq_djb_qg是用户针对此次抽取创建的存储过程名,它是为了解决某个特定的问题而创建的,通过执行该SQL语句,则是调用存储过程。后续每次执行该抽取任务,都会调用这个存储过程去进行数据清洗。
如图2所示,本发明实施例提供一种数据抽取装置20,包括:
数据抽取任务执行模块21,用于执行数据抽取任务,所述数据抽取任务包括在源表中抽取数据,并创建临时表,其中,所述临时表关联自定义数据清洗语句,所述源表执行查询语句,且将查询结果集写入所述临时表;
数据清洗模块22,用于利用所述自定义数据清洗语句对写入了查询结果集的临时表进行数据清洗;
目标表写入模块23,用于根据所抽取的数据的写入方式,将清洗后的临时表写入目标表。
通本发明实施例提供的数据抽取装置,可以对临时表进行功能上的改动,从而对各种不同的源表中的数据进行抽取、清洗以及写入,进而降低现场运维人员的工作难度。
以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。
- 增量数据抽取装置和增量数据抽取方法
- 一种适用于抽取滤波器的数据抽取方法及装置