数据加载的方法及装置转让专利

申请号 : CN201010582286.0

文献号 : CN102486798A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 赵伟郭玮李均洪坤乾张书彬徐钊

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本发明公开了一种数据加载的方法及装置,属于数据库领域。所述方法包括:根据分区的类型创建分区表,所述分区表中包含分区字段;逐行读取需要加载的数据;根据所述分区表的分区信息获取该行数据的分区字段;根据所述数据的分区字段确定该行数据在所述分区表中所属的分区;将该行数据加载到对应的所属分区中。所述装置包括:创建模块、读取模块、获取模块、确定模块和加载模块。本发明通过根据分区表的分区信息获取数据的分区字段,并确定数据在分区表中所属的分区,将该行数据自动加载到对应的分区中去,实现了在分布式文件系统上自动加载数据,从而保证数据加载到正确的分区中,避免了人工指定分区导致的数据加载错误。

权利要求 :

1.一种数据加载的方法,其特征在于,所述方法包括:根据分区的类型创建分区表,所述分区表中包含分区字段;

逐行读取需要加载的数据;

根据所述分区表的分区信息获取该行数据的分区字段;

根据所述数据的分区字段确定该行数据在所述分区表中所属的分区;

将该行数据加载到对应的所属分区中。

2.根据权利要求1所述的方法,其特征在于,所述根据所述分区表的分区信息获取该行数据的分区字段,具体包括:从所述分区表的分区信息中获取所述分区表的分区字段;

根据所述分区表的分区字段匹配出该行数据的分区字段。

3.根据权利要求1所述的方法,其特征在于,所述根据所述数据的分区字段确定该行数据在所述分区表中所属的分区,具体包括:将所述数据的分区字段与所述分区信息中的分区空间进行匹配,将匹配的分区空间对应的分区确定为该行数据在所述分区表中所属的分区。

4.根据权利要求1所述的方法,其特征在于,所述将该行数据加载到对应的所属分区中之后,还包括:对所有生成的分区文件进行扫描,如果所述分区中含有小于文件系统默认块大小的分区文件,则将所述分区目录下的所有文件合并成一个大文件。

5.根据权利要求1所述的方法,其特征在于,所述根据分区的类型创建分区表之后,还包括:根据所述分区表记录所述分区表的元数据,所述元数据包括所述分区表的分区信息及所述分区表与分布式文件系统的映射关系。

6.根据权利要求1所述的方法,其特征在于,所述逐行读取需要加载的数据之后,还包括:根据所述分区表的元数据对该行数据的字段进行解析,判断该行数据的格式是否正确,如果是,则执行所述根据所述分区表的分区信息获取该行数据的分区字段的步骤,否则,报错。

7.一种数据加载的装置,其特征在于,所述装置包括:创建模块,用于根据分区的类型创建分区表,所述分区表中包含分区字段;

读取模块,用于逐行读取需要加载的数据;

获取模块,用于根据所述分区表的分区信息获取所述读取模块读取的该行数据的分区字段;

确定模块,用于根据所述获取模块获取的数据的分区字段确定该行数据在所述分区表中所属的分区;

加载模块,用于将该行数据加载到所述确定模块确定的对应的所属分区中。

8.根据权利要求7所述的装置,其特征在于,所述获取模块,具体用于从所述分区表的分区信息中获取所述分区表的分区字段;根据所述分区表的分区字段匹配出该行数据的分区字段。

9.根据权利要求7所述的装置,其特征在于,所述确定模块,具体用于将所述数据的分区字段与所述分区信息中的分区空间进行匹配,将匹配的分区空间对应的分区确定为该行数据在所述分区表中所属的分区。

10.根据权利要求7所述的装置,其特征在于,所述加载模块之后,还包括:合并模块,用于对所有生成的分区文件进行扫描,如果所述分区中含有小于文件系统默认块大小的分区文件,则将所述分区目录下的所有文件合并成一个大文件。

11.根据权利要求7所述的装置,其特征在于,所述创建模块之后,还包括:记录模块,用于根据所述创建模块创建的分区表记录所述分区表的元数据,所述元数据包括所述分区表的分区信息及所述分区表与分布式文件系统的映射关系。

12.根据权利要求7所述的装置,其特征在于,所述读取模块之后,还包括:解析模块,用于根据所述分区表的元数据对该行数据的字段进行解析,判断该行数据的格式是否正确,如果是,则执行所述获取模块,否则,报错。

说明书 :

数据加载的方法及装置

技术领域

[0001] 本发明涉及数据库领域,特别涉及一种数据加载的方法及装置。

背景技术

[0002] 数据仓库中的表中存储的数据量往往非常大,因此广泛采用分区的方法,将表中的数据按照一定的策略如范围、离散值等方式划分成若干分区。分区的好处是可以在表中相应的分区里进行扫描和查询,避免了全表扫描,提高了分析效率;表中数据的更新、删除和备份等操作都可以按照分区进行,提高了管理效率。因此,分布式数据仓库中存储的海量数据也会采用分区的方法。然而,数据正确加载到对应的分区,是确保分区有意义的前提,否则将导致分析结果不准确和数据管理上的混乱。
[0003] 现有技术中的分布式数据仓库(如分布式系统基础架构数据仓库工具Hadoop Hive)技术方案是依靠人工来保证数据加载到正确的分区,系统不进行分区正确性的检验。在进行数据加载时,分区字段不在表的字段中,而是存在于用户的头脑中,因此当用户向表内加载数据时,用户必须知道当前数据属于哪个分区,指定分区后,系统会将数据拷贝到那个分区中去。
[0004] 在实现本发明的过程中,发明人发现现有技术至少存在以下缺点:
[0005] 在加载数据时需要用户指定将哪些数据加载到哪个分区,因此用户需要充分熟悉系统,掌握分区的原理和数据加载到分区的方法,用户门槛高,易用性差;由于是人工指定分区,可能因为用户的疏忽出现分区错误和弄错文件名等情况,但是系统却会执行错误加载而不给出任何检查和提示,导致数据加载错误;一旦数据加载到系统中后,由于数据中没有分区字段,无法验证数据是否加载正确。

发明内容

[0006] 为了实现在分布式数据仓库上将数据自动加载到正确的分区,本发明实施例提供了一种数据加载的方法及装置。所述技术方案如下:
[0007] 一方面,提供了一种数据加载的方法,所述方法包括:
[0008] 根据分区的类型创建分区表,所述分区表中包含分区字段;
[0009] 逐行读取需要加载的数据;
[0010] 根据所述分区表的分区信息获取该行数据的分区字段;
[0011] 根据所述数据的分区字段确定该行数据在所述分区表中所属的分区;
[0012] 将该行数据加载到对应的所属分区中。
[0013] 其中,所述根据所述分区表的分区信息获取该行数据的分区字段,具体包括:
[0014] 从所述分区表的分区信息中获取所述分区表的分区字段;
[0015] 根据所述分区表的分区字段匹配出该行数据的分区字段。
[0016] 具体地,所述根据所述数据的分区字段确定该行数据在所述分区表中所属的分区,具体包括:
[0017] 将所述数据的分区字段与所述分区信息中的分区空间进行匹配,将匹配的分区空间对应的分区确定为该行数据在所述分区表中所属的分区。
[0018] 进一步地,所述将该行数据加载到对应的所属分区中之后,还包括:
[0019] 对所有生成的分区文件进行扫描,如果所述分区中含有小于文件系统默认块大小的分区文件,则将所述分区目录下的所有文件合并成一个大文件。
[0020] 更进一步地,所述根据分区的类型创建分区表之后,还包括:
[0021] 根据所述分区表记录所述分区表的元数据,所述元数据包括所述分区表的分区信息及所述分区表与分布式文件系统的映射关系。
[0022] 再进一步地,所述逐行读取需要加载的数据之后,还包括:
[0023] 根据所述分区表的元数据对该行数据的字段进行解析,判断该行数据的格式是否正确,如果是,则执行所述根据所述分区表的分区信息获取该行数据的分区字段的步骤,否则,报错。
[0024] 另一方面,提供了一种数据加载的装置,所述装置包括:
[0025] 创建模块,用于根据分区的类型创建分区表,所述分区表中包含分区字段;
[0026] 读取模块,用于逐行读取需要加载的数据;
[0027] 获取模块,用于根据所述分区表的分区信息获取所述读取模块读取的该行数据的分区字段;
[0028] 确定模块,用于根据所述获取模块获取的数据的分区字段确定该行数据在所述分区表中所属的分区;
[0029] 加载模块,用于将该行数据加载到所述确定模块确定的对应的所属分区中。
[0030] 其中,所述获取模块,具体用于从所述分区表的分区信息中获取所述分区表的分区字段;根据所述分区表的分区字段匹配出该行数据的分区字段。
[0031] 具体地,所述确定模块,具体用于将所述数据的分区字段与所述分区信息中的分区空间进行匹配,将匹配的分区空间对应的分区确定为该行数据在所述分区表中所属的分区。
[0032] 进一步地,所述加载模块之后,还包括:
[0033] 合并模块,用于对所有生成的分区文件进行扫描,如果所述分区中含有小于文件系统默认块大小的分区文件,则将所述分区目录下的所有文件合并成一个大文件。
[0034] 更进一步地,所述创建模块之后,还包括:
[0035] 记录模块,用于根据所述创建模块创建的分区表记录所述分区表的元数据,所述元数据包括所述分区表的分区信息及所述分区表与分布式文件系统的映射关系。
[0036] 再进一步地,所述读取模块之后,还包括:
[0037] 解析模块,用于根据所述分区表的元数据对该行数据的字段进行解析,判断该行数据的格式是否正确,如果是,则执行所述获取模块,否则,报错。
[0038] 本发明实施例提供的技术方案的有益效果是:
[0039] 通过记录分区表的元数据,根据元数据中的分区表的分区信息及需要加载的数据的分区字段确定该行数据在分区表中所属的分区,将该行数据自动加载到对应的分区中去,实现了在分布式文件系统上自动加载数据,从而保证数据加载到正确的分区中,避免了人工指定分区导致的数据加载错误;同时,在读取数据时对数据进行解析,而不是直接拷贝,保证了加载的数据的格式的正确性;由于加载的数据中含有分区字段,数据加载到分区中后还可以根据分区字段验证加载的数据是否属于该分区。

附图说明

[0040] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0041] 图1是本发明实施例一提供的数据加载的方法流程图;
[0042] 图2是本发明实施例二提供的数据加载的方法流程图;
[0043] 图3是本发明实施例二提供的表和分区在分布式文件系统上的结构映射示意图;
[0044] 图4是本发明实施例二提供的查询计划的执行流程图;
[0045] 图5是本发明实施例三提供的第一种数据加载的装置结构示意图;
[0046] 图6是本发明实施例三提供的第二种数据加载的装置结构示意图;
[0047] 图7是本发明实施例三提供的第三种数据加载的装置结构示意图;
[0048] 图8是本发明实施例三提供的第四种数据加载的装置结构示意图。

具体实施方式

[0049] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
[0050] 实施例一
[0051] 本发明实施例提供了一种数据加载的方法,参见图1,方法流程具体如下:
[0052] 101:根据分区的类型创建分区表,该分区表中包含分区字段;
[0053] 102:逐行读取需要加载的数据;
[0054] 103:根据分区表的分区信息获取该行数据的分区字段;
[0055] 104:根据该行数据的分区字段确定该行数据在分区表中所属的分区;
[0056] 105:将该行数据加载到对应的所属分区中。
[0057] 本发明实施例提供的方法,通过根据分区表的分区信息获取数据的分区字段,并确定该行数据在分区表中所属的分区,将该行数据自动加载到对应的分区中去,实现了在分布式文件系统上自动加载数据,从而保证数据加载到正确的分区中,避免了人工指定分区导致的数据加载错误;由于加载的数据中含有分区字段,数据加载到分区中后还可以根据分区字段验证加载的数据是否属于该分区。
[0058] 实施例二
[0059] 本发明实施例提供了一种数据加载的方法,参见图2,方法流程具体如下:
[0060] 201:根据分区的类型创建分区表,该分区表中包含分区字段;
[0061] 其中,本发明实施例通过CREATE TABLE语句创建表,也可以使用其它方式创建表,对此不作具体限定。在创建表的时候定义分区的类型,形成分区表。分区的类型可以是范围range类型的分区,也可以是列表list类型的分区,还可以是两者嵌套的复合类型的分区,本发明实施例支持两级嵌套,如range-range,range-list,list-list,list-range四种复合分区类型,但不对其它分区类型进行具体限定。
[0062] 具体地,创建表和定义分区类型的方式如下:
[0063] (1)创建range类型的分区表
[0064] 要想将行映射到基于列值范围的分区,就使用范围分区方法。当数据可以被划分成逻辑范围时,如年度中的月份,采用范围分区就很有用,并且当数据在整个范围中能被均等地划分时性能最好。如果在进行范围分区时会由于不均等的划分而导致分区在大小上明显不同,则需要考虑其它的分区方法。
[0065] 例如:创建range类型的分区表的命令格式为:
[0066] CREATE TABLE table_name(
[0067] Col_nam1 TYPE;
[0068] Col_nam2 TYPE;
[0069] ……
[0070] )
[0071] PARTITION BY RANGE(Col_namX)
[0072] (
[0073] PARTITION par_name1 VALUES LESS THAN(value1),
[0074] PARTITION par_name2 VALUES LESS THAN(value2),
[0075] ……
[0076] );
[0077] 上述命令用来创建一个带range分区的分区表。
[0078] 首先正常创建一个表,包括表名、字段等,如上述CREATE TABLE语句。
[0079] 然后对创建的表进行range分区,指定分区的类型为range类型,在表的字段中选取分区字段,该分区字段必须在表的列中,此后再定义分区空间(至少一个),如上述PARTITION语句,其中PARTITION BY RANGE(Col_namX)指定分区的类型为range类型,分区字段为Co l_namX,此后再定义分区空间,其格式为:PARTITIONVALUES THAN()。
[0080] (2)创建list类型的分区表
[0081] 当需要明确地控制如何将行映射到分区时,就使用列表分区方法。该方法可以在每个分区的描述中为该分区列指定一列离散值。列表分区方法是为遵从离散值的模块化数据划分而设计的,可以非常自然地将无序的和不相关的数据集进行分组和组织到一起。
[0082] 例如:创建list类型的分区表的命令格式为:
[0083] CREATE TABLE table_name(
[0084] Col_nam1 TYPE;
[0085] Col_nam2 TYPE;
[0086] ……
[0087] )
[0088] PARTITION BY LIST(Col_namX)
[0089] (
[0090] PARTITION par_name1 VALUES IN(valueA,valueB,valueC……),[0091] PARTITION par_name2 VALUES IN(valueX,valueY,valueZ……),[0092] ……
[0093] PARTITION default
[0094] );
[0095] 上述命令用来创建一个带list分区的分区表。
[0096] 首先正常创建一个表,包括表名、字段等,如上述CREATE TABLE语句。
[0097] 然后对创建的表进行lis t分区,指定分区的类型为list类型,在表的字段中选取分区字段,该分区字段必须在表的列中,此后再定义分区空间(至少一个),如上述PARTITION语句,其中PARTITION BY LIST(Col_namX)指定分区的类型为list类型,分区字段为Col_namX,此后再定义分区空间,其格式为:PARTITIONVALUES IN(,…)。
[0098] (3)创建复合类型的分区表
[0099] 本发明实施例以复合分区的形式为range-list为例进行说明,其它range-range、list-range、list-list复合分区的形式与range-list分区的形式类似。
[0100] Range-list类型的分区表是范围分区和列表分区的结合,数据先按照范围分区,在每个分区内再进行列表分区。
[0101] 例如:创建range-list类型的分区表的命令格式为:
[0102] CREATE TABLE table_name(
[0103] Col_nam1TYPE;
[0104] Col_nam2TYPE;
[0105] ……
[0106] )
[0107] PARTITION BY RANGE(Col_namX)
[0108] SUBPARTITION BY LIST(Col_namY)
[0109] (
[0110] SUBPARTITION par_name1 VALUES IN(valueA,valueB,valueC……),[0111] SUBPARTITION par_name2 VALUES IN(valueX,valueY,valueZ……),[0112] ……
[0113] SUBPARTITION default)
[0114] (
[0115] PARTITION par_name1VALUES LESS THAN(value1),
[0116] PARTITION par_name2VALUES LESS THAN(value2),
[0117] ……);
[0118] 上述命令用来创建一个带range-list分区的分区表。
[0119] 首先正常创建一个表,包括表名、字段等,如上述CREATE TABLE语句。
[0120] 然后对创建的表进行range-list分区,先进行一级分区——range类型的分区,在进行二级分区——list类型的分区,其分区方法与上述range分区和list分区的方法相类似,在此不再加以赘述,如上述PARTITION部分是一级分区的定义,SUBPARTITION部分是二级分区的定义。
[0121] 202:根据分区表记录该分区表的元数据,该元数据包括该分区表的分区信息及该分区表与分布式文件系统的映射关系;
[0122] 针对此步骤,在分区表创建好后,先在HDFS(Hadoop Distributed FileSystem,分布式文件系统)上创建对应的目录,再在元数据系统中添加这个分区表的元数据。
[0123] 具体地,数据仓库中的表和分区等逻辑概念,在HDFS上都映射为目录。
[0124] 例如,参见图3,创建的分区表为TEST,那么在HDFS上就会建立一个文件夹TEST。如果TEST有两个分区P1和P2,则在TEST目录下会有两个目录P1和P2,如果TEST还有二级分区SP1和SP2,则在P1和P2目录中会各创建两个目录SP1和SP2。
[0125] 其中,在HDFS上的目录结构可以看成表和分区的物理结构,通过元数据系统中的该分区表的元数据将该物理结构和用户定义的range、list或复合分区联系起来。
[0126] 进一步地,在元数据系统中添加这个分区表的元数据,该元数据包括该分区表的分区信息及该分区表和分区的逻辑结构到HDFS上目录结构的映射关系,如将该分区表映射为HDFS上的目录,将分区映射为该分区表的目录的子目录,将文件中的数据映射为该分区表的行和字段等。元数据系统中的元数据在进行SQL(Structured Query Language,结构化查询语言)查询时要用到。分区表的元数据信息具体如下表所示:
[0127]
[0128] 表1分区表的元数据信息
[0129] 其中,Pri_partition属性存放分区表的一级分区信息,如果该分区表没有一级分区,则这个字段为空。Sub_partition属性存放分区表的二级分区信息,如果该分区表没有二级分区,则这个字段为空。分区信息的元数据信息具体如下表所示:
[0130]
[0131] 表2分区信息的元数据信息
[0132] 其中,分区表的每级分区可以包括多层分区信息,由不同的分区空间划分不同层的分区信息。分区空间是一个(key,value)对的容器,key是分区名,value是分区定义。例如,在创建了一个range类型的分区P1后,它的定义是分区字段值小于10,则在分区空间中,会保存一个(P1,10)的(key,value)对;如果创建的是一个list类型的分区P2,它的定义是分区字段值为(2,4,6),则在分区空间中,会保存一个(P2,2:4:6)的(key,value)对。
[0133] 203:逐行读取需要加载的数据;
[0134] 其中,在进行数据加载时,使用LOAD语句生成自动化分区加载的查询计划,该查询计划是由FileScanOp、PartitionerOp和FileSinkOp三个算子组成的执行树,每一个算子代表一定的执行动作,按照这个查询计划,丛树的起始节点执行到结束节点,得到最终的执行结果。FileScanOp、PartitionerOp和FileSinkOp三个算子包括但不限于如下操作:FileScanOp算子扫描文件,将文件一行一行的读取出来,送给PartitionerOp算子;PartitionerOp算子检查出入的一行记录的分区字段,将它路由到对应的分区的FileSinkOp算子,输出到对应的分区中去;FileSinkOp算子将传入的记录写到指定的文件夹中。
[0135] 例如,将HDFS中的/data/data1.txt文件的内容加载到分区表test中时,LOAD语句如下:
[0136] LOAD DATA INPATH′/data/data1.txt′INTOTABLE test;
[0137] 具体地,逐行读取需要加载的数据需要用FileScanOp算子来实现。FileScanOp算子包含了要扫描的文件的路径,以及对文件的解析方法。该解析方法可以从分区表的元数据中获得,通过解析方法,将需要加载的数据从文件中一行一行的读出。
[0138] 204:根据分区表的元数据对该行数据的字段进行解析,判断该行数据的格式是否正确,如果是,则执行步骤205,否则,执行步骤209;
[0139] 具体地,通过FileScanOp算子,获取要存入的分区表的元数据,用该元数据中的文件的解析方法对该行数据的字段进行解析,在解析的过程中,判断该行数据的格式是否正确,判断的方式可以为将分区表的元数据中的数据文件的格式和列名等信息与该行数据的字段进行匹配,如果匹配,则判断该行数据的格式正确,如果不匹配,则判断该行数据的格式不正确,本发明实施例仅以上述判断的方式为例,但不限定于此。
[0140] 其中,本步骤为可选步骤,执行该步骤可以保证加载的数据的格式的正确性。本发明实施例是以执行步骤204为例进行说明的,在实现本发明的过程当中,也可以在执行完步骤203之后,跳过步骤204,直接执行步骤205。
[0141] 205:根据分区表的分区信息获取该行数据的分区字段;
[0142] 具体地,通过PartitionerOp算子,根据分区表的分区信息获取该行数据的分区字段,具体为从分区表的分区信息中获取该分区表的分区字段;根据该分区表的分区字段匹配出该行数据的分区字段。
[0143] 206:根据该行数据的分区字段确定该行数据在分区表中所属的分区;
[0144] 具体地,根据该行数据的分区字段确定该行数据在分区表中所属的分区,具体为将该行数据的分区字段与分区信息中的分区空间进行匹配,将匹配的分区空间对应的分区确定为该行数据在分区表中所属的分区。
[0145] 其中,将该行数据的分区字段与分区信息中的分区空间进行匹配的方式有多种,本发明实施例对此不作具体限定,仅以通过PartitionerOp算子构建一系列的计算器Evaluator,并用Evaluator确定该行数据在分区表中所属的分区为例进行说明。首先根据元数据中的每层分区信息构建一系列与其对应的计算器,用这一系列的计算器对该行数据的分区字段进行测试,如果测试结果为匹配,则该数据属于这个测试的Evaluator代表的分区,如果测试结果不匹配,则继续用下一个Evaluator进行测试,如果最后一个Evaluator的测试结果仍不匹配,则向用户返回异常。如果存在默认default分区,则最后一个Evaluator为default分区的Evaluator,default分区的Evaluator返回的测试结果总是匹配的。如果含有二级分区,还将构建二级分区的Evaluator,该行数据在进行完一级分区的匹配后,还要进行二级分区的匹配,最后确定该行数据属于哪一个一级分区下的二级分区中。
[0146] 207:将该行数据加载到对应的所属分区中;
[0147] 具体地,PartitionerOp确定该行数据在分区表中所属的分区后,将该行数据路由到该分区的FileSinkOp算子中,由FileSinkOp算子调用HDFS的接口,将该行数据写入到它所属的分区的目录中去。
[0148] 208:对所有生成的分区文件进行扫描,如果分区中含有小于文件系统默认块大小的分区文件,则将该分区目录下的所有文件合并成一个大文件,流程结束;
[0149] 具体地,在扫描生成的分区文件时,检查文件的大小,如果所有文件的大小都大于文件系统默认块大小,则不触发合并行为。如果发现至少有一个文件的大小小于文件系统默认块大小,则将此分区目录下的所有文件,合并为一个文件。
[0150] 其中,本步骤为可选步骤,执行该步骤可以提升HDFS的运行效率。本发明实施例是以执行步骤208为例进行说明的,在实现本发明的过程当中,也可以不执行本步骤。
[0151] 209:如果该行数据的格式不正确,则报错,提醒用户检查数据是否正确,流程结束。
[0152] 具体地,提醒用户检查载入的数据文件是否正确,包括路径错误或字段错误等,用户可以重新加载正确的数据。
[0153] 其中,本步骤为可选步骤,在本发明实施例包含步骤204的前提下则执行本步骤。如果在实现本发明的过程当中不执行步骤204,则不执行本步骤。
[0154] 如图4所示,上述查询计划最终可以转化为一个Map函数在集群每台机器的本地运行。每个Map函数读取本地的数据,然后按照分区信息和分区字段,自动将数据加载到正确的分区。由于数据文件在HDFS的集群中,所以在进行自动化加载时,MapReduce框架会尽量在存放该数据文件的机器上执行Map函数以保证本地化计算,Map函数的输出还是在文件系统上,减少了网络的输入输出接口,同时数据是并行加载的,效率高。
[0155] 本发明实施例提供的方法,通过记录分区表的元数据,根据元数据中的分区表的分区信息及需要加载的数据的分区字段确定该行数据在分区表中所属的分区,将该行数据自动加载到对应的分区中去,实现了在HDFS上自动加载数据,从而保证数据加载到正确的分区中,避免了人工指定分区导致的数据加载错误;同时,在读取数据时对数据进行解析,而不是直接拷贝,保证了加载的数据的格式的正确性;由于加载的数据中含有分区字段,数据加载到分区中后还可以根据分区字段验证加载的数据是否属于该分区。
[0156] 实施例三
[0157] 参见图5,本发明实施例提供了一种数据加载的装置,该装置包括:
[0158] 创建模块501,用于根据分区的类型创建分区表,该分区表中包含分区字段;
[0159] 读取模块502,用于逐行读取需要加载的数据;
[0160] 获取模块503,用于根据分区表的分区信息获取读取模块502读取的该行数据的分区字段;
[0161] 确定模块504,用于根据获取模块503获取的数据的分区字段确定该行数据在分区表中所属的分区;
[0162] 加载模块505,用于将该行数据加载到确定模块504确定的对应的所属分区中。
[0163] 其中,获取模块503,具体用于从分区表的分区信息中获取该分区表的分区字段;根据该分区表的分区字段匹配出该行数据的分区字段。
[0164] 具体地,确定模块504,具体用于将数据的分区字段与分区信息中的分区空间进行匹配,将匹配的分区空间对应的分区确定为该行数据在分区表中所属的分区。
[0165] 进一步地,参见图6,加载模块505之后,还包括:
[0166] 合并模块506,用于对所有生成的分区文件进行扫描,如果所述分区中含有小于文件系统默认块大小的分区文件,则将所述分区目录下的所有文件合并成一个大文件。
[0167] 更进一步地,参见图7,创建模块501之后,还包括:
[0168] 记录模块507,用于根据创建模块501创建的分区表记录该分区表的元数据,该元数据包括该分区表的分区信息及该分区表与分布式文件系统的映射关系。
[0169] 再进一步地,参见图8,读取模块502之后,还包括:
[0170] 解析模块508,用于根据分区表的元数据对该行数据的字段进行解析,判断该行数据的格式是否正确,如果是,则执行获取模块503,否则,报错。
[0171] 综上所述,本发明实施例通过记录分区表的元数据,根据元数据中的分区表的分区信息及需要加载的数据的分区字段确定该行数据在分区表中所属的分区,将该行数据自动加载到对应的分区中去,实现了在HDFS上自动加载数据,从而保证数据加载到正确的分区中,避免了人工指定分区导致的数据加载错误;同时,在读取数据时对数据进行解析,而不是直接拷贝,保证了加载的数据的格式的正确性;由于加载的数据中含有分区字段,数据加载到分区中后还可以根据分区字段验证加载的数据是否属于该分区。
[0172] 需要说明的是:上述实施例提供的数据加载的装置在自动加载数据时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的数据加载的装置与数据加载的方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
[0173] 上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0174] 本发明实施例中的全部或部分步骤,可以利用软件实现,相应的软件程序可以存储在可读取的存储介质中,如光盘或硬盘等。
[0175] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的66保护范围之内。