【
技术领域:
:】本发明涉及数据处理领域,具体涉及一种在hive中数据迁移方法、装置及终端设备。
背景技术:
::在大数据时代,数据格式越来越多种,数据量越来越庞大,有时候需要把数据从一个数据库迁移至另一个数据库,相应地,也就是要把数据从一个表迁移至另外一个表,数据迁移包括迁移和删除操作,目前,数据迁移操作一是由人工手动完成,而人工手动完成费时且麻烦,或是在服务器写shell脚本完成,而利用shell脚本完成所需逻辑复杂也麻烦,因此需要一种新的方案来解决大量数据的迁移问题。技术实现要素:本发明的目的在于提供一种在hive中数据迁移方法,以将大量数据从源表(源数据库)迁移至目标表(目标数据库)中。为实现该目的,本发明采用如下技术方案:第一方面,本发明提供一种在hive中数据迁移方法,包括如下步骤:将源数据库的数据文件通过hive映射为源表;判断源表的预设分区是否存在数据记录;当所述源表的预设分区存在数据记录时,获取所述源表的预设分区的所有字段的数据记录;将所述源表的预设分区的数据记录写入目标数据库的目标表的对应分区中。进一步的,在所述将所述源表的预设分区的数据记录写入目标数据库的目标表的对应分区中之后,还包括:判断目标表对应分区的数据记录条数与源表预设分区的数据记录条数是否相同,若相同,删除源表的预设分区的数据记录。具体的,所述判断源表的预设分区是否存在数据记录,当所述源表的预设分区存在数据记录时的步骤,包括:利用断言函数判断源表的预设分区是否存在数据记录;当所述源表的预设分区的数据记录条数大于零时,确定所述源表的预设分区存在数据记录。优选的,所述判断目标表对应分区的数据记录条数与源表预设分区的数据记录条数是否相同,包括:利用断言函数判断目标表对应分区的数据记录数与源表预设分区的数据记录数是否相同。较佳的,在所述断源表的预设分区是否存在数据记录之后,当所述源表的预设分区不存在数据记录时,输出异常信息并停止执行后续操作。较佳的,在所述判断目标表对应分区的数据记录数与源表预设分区的数据记录数是否相同之后,若不相同,输出异常信息并停止执行后续步骤。进一步的,所述将所述源表的预设分区的数据记录写入目标数据库的目标表的对应分区中,包括:将所述源表的预设分区的数据记录进行加工处理,形成加工后的数据记录后写入目标数据库的目标表的对应分区中。第二方面,本发明还提供一种在hive中数据迁移装置,包括:加载模块:用于将源数据库的数据文件通过hive映射为源表;判断模块:用于判断源表的预设分区是否存在数据记录;获取模块:用于当所述源表的预设分区存在数据记录时,获取所述源表的预设分区的所有字段的数据记录;迁移模块:用于将所述源表的预设分区的数据记录写入目标数据库的目标表的对应分区中。进一步的,所述装置还包括:删除模块:用于判断目标表对应分区的数据记录条数与源表预设分区的数据记录条数是否相同,若相同,删除源表的预设分区的数据记录。第三方面,本发明还提供一种终端设备,包括处理器及存储器,所述存储器中存储有计算机程序,所述计算机程序被处理器执行时实现任意一项所述在hive中数据迁移方法的步骤。与现有技术相比,本发明具备如下优点:本发明通过hive将源数据库的数据文件映射为源表,利用hive的分区属性通过写查询语言的方式将数据从源表一部分一部分地写入目标表中,以完成源数据库的数据迁移至目标数据库,操作简单,逻辑清晰明了。同时,在将源表的数据写入目标表后,将源表的数据进行删除,为hadoop集群腾出存储空间,避免源表的数据挤占集群的存储。另外,利用断言函数在将源表的数据写入目标表之前进行判断以及在将源表的数据进行删除前进行判断,避免目标表的数据没有成功写入而源表的数据已被删除的情况,同时采用断言函数不增加实际应用的代码量,保证代码执行的高效性。显然,上述有关本发明优点的描述是概括性的,更多的优点描述将体现在后续的实施例揭示中,以及,本领域技术人员也可以本发明所揭示的内容合理地发现本发明的其他诸多优点。本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。【附图说明】图1为本发明在hive中数据迁移方法的一实施例流程示意图。图2为本发明在hive中数据迁移装置的一实施例示意图。【具体实施方式】下面结合附图和示例性实施例对本发明作进一步地描述,其中附图中相同的标号全部指的是相同的部件。此外,如果已知技术的详细描述对于示出本发明的特征是不必要的,则将其省略。步骤s100:将源数据库的数据文件通过hive映射为源表;本发明实施例中对数据迁移是指将源数据库的数据迁移至目标数据库,相应的也是将源数据库的表数据迁移至目标数据库的对应表中。本发明实施例中,在对源数据库的数据迁移前,通过hive将源数据库的数据文件映射为源表,hive是基于hadoop构建的一个数据仓库工具,可以将结构化的数据文件映射为一张张数据库表,并定义了类sql查询语句的hql查询语句提供完整的查询功能,同时提供一系列工具用于对数据提取、转化和加载,以此来存储、查询和分析存储在hadoop中的大规模数据。在hive中有多种数据的导入方式,本实施例中,采用从本地文件系统中导入数据到hive表或从hdfs(hadoopdistributedfilesystem)上导入数据到hive表任意一种方式以将源数据库的数据文件通过hive映射为源表,所述源表包括了表的结构与表的数据记录。步骤s200:判断源表的预设分区是否存在数据记录;在得到需要迁移数据的源表后,判断源表的预设分区是否存在数据记录,在hive中,为了提升数据的查询和写入性能提供了分区表机制,数据是根据分区字段的取值来存放的,分区字段的取值不同的数据彼此之间是隔离的,一般的,可以按照时间、地域或者是商业维度对源表的数据进行分区,当所述分区存在至少一条数据记录时,则确定该分区存在数据记录。具体的,本实施例中所述判断源表的预设分区是否存在数据记录的步骤,包括:利用断言函数判断源表的预设分区是否存在数据记录;当所述源表的预设分区的数据记录条数大于零时,确定所述源表的预设分区存在数据记录。本实施例中,所述预设分区包括时间分区、地域分区或者是商业维度分区,每一次的数据迁移即迁移一个分区中的所有数据。下述以时间分区为例进行说明,时间分区可以是以日期划分、小时划分等,在以时间分区下对数据进行迁移时,每一次将某一段时间内的数据进行迁移,多次迁移不同时间段内的数据以将所有数据进行迁移,例如可以使用日期(dt)分区将数据分为“今天的数据”、“昨天的数据”、“20170520的数据”等。本实施例中,通过判断源表的预设分区的数据记录条数是否大于0来判断源表的预设分区是否存在数据记录,本实施例中,表中的一行数据记录若存在取值不为空的数据字段则记为1条数据记录,若一行数据记录的所有数据字段(不包括分区字段)的取值均为空,则该行数据记录在hive的长度为0,利用count(*)统计表中的数据记录条数时该行数据记录不计入记录条数中或在原有记录条数上加0。例如,假设当前要对“今天”(即dt='tdate')的数据进行迁移,具体的,通过selectcount(*)yt_cntfrom源表wheredt='tdate'得到源表的预设分区(日期分区dt='tdate')的数据记录条数,然后当所述源表的预设分区的数据记录条数大于零(即yt_cnt>0)时,则确定源表的预设分区存在数据记录。进一步的,利用断言函数assert_true()判断源表的预设分区的数据记录条数大于0(即yt_cnt>0)是否为真,以此判断源表的预设分区是否存在数据记录,断言函数针对所传入的条件表达式判断其真假,若为真,则返回null,若为假,则输出异常信息并不再执行后续操作。具体的,本实施例中,利用断言函数判断源表的预设分区是否存在数据记录如下:selectassert_true(yt_cnt>0)from(selectcount(*)yt_cntfrom源表wheredt='tdate')t1;可选的,本实施例也可以用其它判断语句如if语句来判断源表的预设分区是否存在数据记录,if语句是实的,真正的增加代码量,降低执行效率;而本实施例优选使用断言函数,相对于if语句,断言函数是虚的,在debug的时候可以帮助调试,在release的时候并不存在,不增加实际的代码量,保证代码执行的高效性。本发明的另一实施例中,在所述判断源表的预设分区是否存在数据记录之后,还包括:当所述源表的预设分区不存在数据记录时,输出异常信息并停止执行后续操作,即当断言函数assert_true()判断所传入的条件yt_cnt>0为假,也即所述源表的预设分区不存在数据记录时,输出异常信息并停止执行后续操作,以让用户第一时间知晓该数据迁移出现异常(源表中已没有数据记录)并考虑进一步的处理方案。步骤s300:当所述源表的预设分区存在数据记录时,获取所述源表的预设分区的数据记录。步骤s400:将所述源表的预设分区的数据记录写入目标数据库的目标表的对应分区中。当上述判断确定源表的预设分区存在数据记录时,获取所述源表的预设分区的数据记录,具体的,获取源表的预设分区的每一条数据记录中数据字段的取值,然后将其写入目标数据库的目标表的对应分区中。本发明旨在将源数据库的所有数据迁移至目标数据库中,同时考虑到整个数据库的数据量过大,将所有数据分为多个不同的分区,然后每一次迁移一个分区的所有数据,即每一次将一个分区的表的每一行数据记录覆盖写入到目标数据库的目标表中,若不对迁移的数据进行额外的加工处理,则等同于将源表的预设分区的每一行数据记录中写入到目标表对应的分区中。例如,本实施例中以日期(dt)进行分区,并要对“今天”即dt='tdate'的数据进行迁移,在该分区内有3个数据字段col1、col2、col3,同时假设将数据从源表迁移至目标表时不做额外的加工处理,则获取所述源表的预设分区的数据记录,并将所述源表的预设分区的数据记录写入目标数据库的目标表的对应分区中,具体如下:insertoverwritetable目标表partition(dt='tdate')selectcol1,col2,col3from源表wheredt='tdate';进一步的,本发明的一种实施例中,在将所述源表的预设分区的数据记录写入目标数据库的目标表的对应分区中之后,还包括:步骤s500:判断目标表对应分区的数据记录条数与源表预设分区的数据记录条数是否相同,若相同,删除源表的预设分区的数据记录。当数据量很大时,将源表的数据迁移至目标表后,需要将源表的数据进行删除,避免重复的数据占用过多的存储空间,在删除源表的数据之时,需要判断迁移后的目标表的数据记录条数与源表的数据记录条数是否相同,若相同,则确定数据迁移无误,进而即可删除源表的数据。本实施例中判断目标表对应分区的数据记录条数与源表预设分区的数据记录条数是否相同,仍然以分区dt='tdate'为例,具体如下:selectassert_true(t1.yt_cnt>1andt2.mb_cnt>1andt1.yt_cnt=t2.mb_cnt)from(selectcount(*)yt_cntfrom源表wheredt='tdate')t1leftjoin(selectcount(*)mb_cntfrom目标表wheredt='tdate')t2on1=1;若相同,删除源表中预设分区的数据记录,具体如下:altertable源表droppartition(dt='tdate');在hive中写入数据都是覆盖式的写入,假如某天的数据之前已经迁移过并已经删除了源表数据,而在迁移若不加以判断,就会把目标表这天原本已经有了的数据给覆盖掉了,这时目标表该天的数据是没有成功写入的,若不加以判断就直接删掉源表数据,会造成比较恶劣的后果。同样的,本实施例中,利用断言函数判断目标表对应分区的数据记录数与源表预设分区的数据记录数是否相同。进一步的,当断言函数assert_true()判断所传入的条件t1.yt_cnt>1andt2.mb_cnt>1andt1.yt_cnt=t2.mb_cnt为假即所述目标表对应分区的数据记录条数与源表预设分区的数据记录条数不相同时,输出异常信息并停止执行后续操作,以让用户第一时间知晓该数据迁移出现异常并考虑进一步的处理方案。可选的,本实施例也可以用其它判断语句如if语句来目标表对应分区的数据记录数与源表预设分区的数据记录数是否相同,if语句是实的,真正的增加代码量,降低执行效率;而本实施例优选使用断言函数,相对于if语句,断言函数是虚的,在debug的时候可以帮助调试,在release的时候并不存在,不增加实际的代码量,保证代码执行的高效性。至此,完成了把数据从一个表(源表)迁移至另外一个表(目标表),也相当于把数据从一个数据库(源数据库)迁移至另外一个数据库(目标数据库),而且在数据迁移完成后,还删除了源表的数据,为hadoop集群腾出存储空间,避免源表的数据挤占集群的存储。进一步的,本发明的另一种实施例中,当需要对源表中的数据记录进行一定处理后再迁移至目标表中时,所述将所述源表的预设分区的数据记录写入目标数据库的目标表的对应分区中的步骤,包括:将所述源表的预设分区的数据记录进行加工处理,形成加工后的数据记录后写入目标数据库的目标表的对应分区中。具体的,所述加工处理是对预设分区的数据记录中的某一个数据字段的所有取值进行处理,例如将数据字段col1的所有取值均加1然后再写入目标数据库的目标表的对应分区中,在迁移数据的同时一并处理数据,让数据处理更加方便、高效。同样的,在将数据记录写入目标表后,判断写入数据记录后的目标表的数据记录条数与源表的数据记录条数是否相同,若相同,删除源表中的数据记录。第二方面,如图2所示是本发明在hive中数据迁移装置的一实施例示意图,包括:加载模块100:用于将源数据库的数据文件通过hive映射为源表。本发明实施例中对数据迁移是指将源数据库的数据迁移至目标数据库,相应的也是将源数据库的表数据迁移至目标数据库的对应表中。本发明实施例中,在对源数据库的数据迁移前,通过hive中的加载模块100将源数据库的数据文件映射为源表,hive是基于hadoop构建的一个数据仓库工具,可以将结构化的数据文件映射为一张张数据库表,并定义了类sql查询语句的hql查询语句提供完整的查询功能,同时提供一系列工具用于对数据提取、转化和加载,以此来存储、查询和分析存储在hadoop中的大规模数据。在hive中有多种数据的导入方式,本实施例中,加载模块100采用从本地文件系统中导入数据到hive表或从hdfs(hadoopdistributedfilesystem)上导入数据到hive表任意一种方式以将源数据库的数据文件通过hive映射为源表,所述源表包括了表的结构与表的数据记录。判断模块200:用于判断源表的预设分区是否存在数据记录。在得到需要迁移数据的源表后,判断模块200判断源表的预设分区是否存在数据记录,在hive中,为了提升数据的查询和写入性能提供了分区表机制,数据是根据分区字段的取值来存放的,分区字段的取值不同的数据彼此之间是隔离的,一般的,可以按照时间、地域或者是商业维度对源表的数据进行分区,当所述分区存在至少一条数据记录时,则确定该分区存在数据记录。具体的,本实施例中判断模块200判断源表的预设分区是否存在数据记录的过程,包括:利用断言函数判断源表的预设分区是否存在数据记录;当所述源表的预设分区的数据记录条数大于零时,确定所述源表的预设分区存在数据记录。本实施例中,通过判断源表的预设分区的数据记录条数是否大于0来判断源表的预设分区是否存在数据记录,本实施例中,表中的一行数据记录若存在取值不为空的数据字段则记为1条数据记录,若一行数据记录的所有数据字段(不包括分区字段)的取值均为空,则该行数据记录在hive的长度为0,利用count(*)统计表中的数据记录条数时该行数据记录不计入记录条数中或在原有记录条数上加0。获取模块300:用于当所述源表的预设分区存在数据记录时,获取所述源表的预设分区的所有字段的数据记录。迁移模块400:用于将所述源表的预设分区的数据记录写入目标数据库的目标表的对应分区中。当上述判断确定源表的预设分区存在数据记录时,获取模块300获取所述源表的预设分区的数据记录,具体的,获取模块300获取源表的预设分区的每一条数据记录中数据字段的取值,然后迁移模块400将其写入目标数据库的目标表的对应分区中。本发明旨在将源数据库的所有数据迁移至目标数据库中,同时考虑到整个数据库的数据量过大,将所有数据分为多个不同的分区,然后每一次迁移一个分区的所有数据,即每一次将一个分区的表的每一行数据记录覆盖写入到目标数据库的目标表中,若不对迁移的数据进行额外的加工处理,则等同于将源表的预设分区的每一行数据记录中写入到目标表对应的分区中。进一步的,所示装置还包括:删除模块500:用于判断目标表对应分区的数据记录条数与源表预设分区的数据记录条数是否相同,若相同,删除源表的预设分区的数据记录。当数据量很大时,将源表的数据迁移至目标表后,需要将源表的数据进行删除,避免重复的数据占用过多的存储空间,在删除源表的数据之时,删除模块500判断迁移后的目标表的数据记录条数与源表的数据记录条数是否相同,若相同,则确定数据迁移无误,进而即可删除源表的数据。第三方面,本发明还提供一种终端设备,包括处理器及存储器,所述存储器中存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如下步骤:将源数据库的数据文件通过hive映射为源表;判断源表的预设分区是否存在数据记录;当所述源表的预设分区存在数据记录时,获取所述源表的预设分区的所有字段的数据记录;将所述源表的预设分区的数据记录写入目标数据库的目标表的对应分区中;判断目标表对应分区的数据记录条数与源表预设分区的数据记录条数是否相同,若相同,删除源表的预设分区的数据记录。本发明通过hive将源数据库的数据文件映射为源表,利用hive的分区属性通过写查询语言的方式将数据从源表一部分一部分地写入目标表中,以完成源数据库的数据迁移至目标数据库,操作简单,逻辑清晰明了;同时,在将源表的数据写入目标表后,将源表的数据进行删除,为hadoop集群腾出存储空间,避免源表的数据挤占集群的存储;另外,利用断言函数在将源表的数据写入目标表之前进行判断以及在将源表的数据进行删除前进行判断,避免目标表的数据没有成功写入而源表的数据已被删除的情况,同时采用断言函数不增加实际应用的代码量,保证代码执行的高效性。虽然上面已经示出了本发明的一些示例性实施例,但是本领域的技术人员将理解,在不脱离本发明的原理或精神的情况下,可以对这些示例性实施例做出改变,本发明的范围由权利要求及其等同物限定。当前第1页12当前第1页12