CN114461716A - 数据加载方法、装置、存储介质及电子设备 - Google Patents
数据加载方法、装置、存储介质及电子设备 Download PDFInfo
- Publication number
- CN114461716A CN114461716A CN202210120492.2A CN202210120492A CN114461716A CN 114461716 A CN114461716 A CN 114461716A CN 202210120492 A CN202210120492 A CN 202210120492A CN 114461716 A CN114461716 A CN 114461716A
- Authority
- CN
- China
- Prior art keywords
- data
- loading
- query
- iterator
- component
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/254—Extract, transform and load [ETL] procedures, e.g. ETL data flows in data warehouses
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/258—Data format conversion from or to a database
Abstract
本公开提供一种数据加载方法、装置、存储介质及电子设备;涉及计算机技术领域。所述方法包括:接收到数据加载请求时,创建数据查询组件;调用所述数据查询组件的预设接口生成迭代器对象;通过所述迭代器对象加载目标分片数据,并将所述目标分片数以预设数据格式返回。本公开可以通过数据查询组件对分片数据进行透明加载,数据加载服务与业务系统解耦,降低了分片数据加载的复杂度,提高了开发效率。
Description
技术领域
本公开涉及计算机技术领域,具体而言,涉及一种数据加载方法、数据加载装置、计算机可读存储介质以及电子设备。
背景技术
随着业务快速发展,业务数据库中的数据量猛增,导致数据库性能降低。这时就需要将对应数据库中的数据分散在不同的数据库中,并且将大表也拆分为若干小表,即通过分库分表来解决由于数据量过大而导致数据库性能降低的问题。
目前,对分库分表数据进行离线处理时,分库分表数据的加载过程较为复杂,从而使得离线数据处理任务的开发效率较低。
需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
本公开的目的在于提供一种数据加载方法、数据加载装置、计算机可读存储介质以及电子设备,进而在一定程度上克服由于相关技术的限制和缺陷而导致的进行离线数据处理时开发效率较低的问题。
根据本公开的第一方面,提供一种数据加载方法,包括:
接收到数据加载请求时,创建数据查询组件;
调用所述数据查询组件的预设接口生成迭代器对象;
通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回。
在本公开的一种示例性实施例中,所述接收到数据加载请求时,创建数据查询组件,包括:
接收所述数据加载请求中的查询参数;
根据所述查询参数创建对应的组件实例;
对所述组件实例进行配置得到所述数据查询组件,所述数据查询组件配置有原始查询语句、分片数据属性信息和对象映射器。
在本公开的一种示例性实施例中,所述调用所述数据查询组件的预设接口生成迭代器对象,包括:
调用所述数据查询组件的第一接口,返回第一迭代器对象,所述第一迭代器对象用于加载单个分片数据;或者
调用所述数据查询组件的第二接口,返回第二迭代器对象,所述第二迭代器对象用于加载批量分片数据。
在本公开的一种示例性实施例中,所述通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回,包括:
通过所述迭代器对象对所述原始查询语句进行预编译,得到目标查询语句;
通过所述目标查询语句得到所述目标分片数据,并将所述目标分片数据以预设数据格式返回。
在本公开的一种示例性实施例中,所述通过所述迭代器对象对所述原始查询语句进行预编译,得到目标查询语句,包括:
调用所述迭代器对象的数据查询接口;
基于所述分片数据属性信息,通过所述数据查询接口对所述原始查询语句进行预编译,得到目标查询语句。
在本公开的一种示例性实施例中,所述通过所述目标查询语句得到所述目标分片数据,并将所述目标分片数据以预设数据格式返回,包括:
利用所述目标查询语句遍历所述迭代器对象,得到所述目标分片数据;
利用所述对象映射器将所述目标分片数据进行封装,并返回封装后的目标分片数据。
在本公开的一种示例性实施例中,所述方法还包括:
配置数据源、逻辑数据源对象和逻辑数据层对象,以利用所述数据查询组件根据配置好的数据源、逻辑数据源对象和逻辑数据层对象进行数据加载。
根据本公开的第二方面,提供一种数据加载装置,包括:
组件创建模块,用于接收到数据加载请求时,创建数据查询组件;
对象生成模块,用于调用所述数据查询组件的预设接口生成迭代器对象;
数据加载模块,用于通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回。
根据本公开的第三方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任意一项所述的方法。
根据本公开的第四方面,提供一种电子设备,包括:处理器;以及存储器,用于存储所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行上述任意一项所述的方法。
本公开示例性实施例可以具有以下部分或全部有益效果:
在本公开示例实施方式所提供的数据加载方法中,通过接收到数据加载请求时,创建数据查询组件;调用所述数据查询组件的预设接口生成迭代器对象;通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回。一方面,通过数据查询组件生成迭代器对象后,可以通过迭代器对象执行分片数据的加载逻辑实现分片数据的加载,无需引入大数据组件加载分片数据或者通过切换数据库表查询分片数据,降低了分片数据加载的复杂度,从而提高了离线数据处理任务的开发效率。同时,通过迭代器对象加载分片数据可以实现数据加载服务与业务系统解耦,使得整个数据加载过程对业务开发者是透明的,即业务开发者不需要关注迭代器对象内部复杂的加载逻辑,只需要关注业务逻辑的开发,进一步提高了离线数据处理任务的开发效率;另一方面,数据查询组件中封装的分片数据加载逻辑可以适用于所有的数据处理任务,无需针对每个数据处理任务重新开发对应的分片数据加载逻辑,扩展性较高。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1示出了可以应用本公开实施例的一种数据加载方法及装置的示例性系统架构的示意图;
图2示意性示出了根据本公开的一个实施例的数据加载方法的流程图;
图3示意性示出了根据本公开的一个实施例的通过迭代器对象获取目标分片数据的流程图;
图4示意性示出了根据本公开的一个实施例的分片数据加载装置结构图;
图5示意性示出了根据本公开的另一个实施例的数据加载方法的流程图;
图6示意性示出了根据本公开的一个实施例的分片数据加载装置配置的流程图;
图7示意性示出了根据本公开的又一个实施例的数据加载方法的流程图;
图8示意性示出了根据本公开的一个实施例的数据加载装置的框图;
图9示意性示出了适于用来实现本公开实施例的电子设备的计算机系统的结构示意图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。在下面的描述中,提供许多具体细节从而给出对本公开的实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略所述特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知技术方案以避免喧宾夺主而使得本公开的各方面变得模糊。
此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
图1示出了可以应用本公开实施例的一种数据加载方法及装置的示例性系统架构的示意图。
如图1所示,系统架构100可以包括终端设备101、102、103中的一个或多个,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。终端设备101、102、103可以是具有显示屏的各种电子设备,包括但不限于台式计算机、便携式计算机、智能手机和平板电脑等等。应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。比如服务器105可以是多个服务器组成的服务器集群等。
本公开实施例所提供的数据加载方法一般由服务器105执行,相应地,数据加载装置一般设置于服务器105中,服务器可以将加载到的分片数据发送至终端设备,并由终端设备向用户进行展示。但本领域技术人员容易理解的是,本公开实施例所提供的数据加载方法也可以由终端设备101、102、103执行,相应的,数据加载装置也可以设置于终端设备101、102、103中,例如,由终端设备执行后可以将加载到的分片数据直接显示在终端设备的显示屏上,本示例性实施例中对此不做特殊限定。
以下对本公开实施例的技术方案进行详细阐述:
以OLTP(Online Transaction Processing,联机事务处理)场景的系统为例,通常可以采用MySQL数据库进行业务数据存储。随着业务快速发展,业务数据库中的数据量猛增,导致数据库性能降低。这时就需要将对应数据库中的数据分散在不同的数据库中,并且将大表也拆分为若干小表,即通过分库分表来解决由于数据量过大而导致数据库性能降低的问题。
业务数据分库分表之后,针对业务数据离线数据处理任务的实现,通常有两种方式:一种是可以通过监听数据库的binlog日志,将数据同步收集到大数据平台进行统一存储,再在大数据平台执行相应的离线计算。另一种是可以在业务系统中通过编码直接读取数据库的从库,逐个库、逐个表进行数据读取,再进行相应的离线计算。
但是,第一种方法中需要引入大数据平台,增加了数据处理的复杂度。第二种方法虽然不需要大数据平台,但是会提高编码复杂度,其中需要将分片数据加载的代码逻辑耦合到业务代码中,增加了开发和测试难度,导致开发效率较低。
基于上述一个或多个问题,本示例实施方式提供了一种数据加载方法,该方法可以应用于上述服务器105,也可以应用于上述终端设备101、102、103中的一个或多个,本示例实施方式对此不做特殊限定。
参考图2所示,该数据加载方法可以包括以下步骤S210至步骤S230:
步骤S210.接收到数据加载请求时,创建数据查询组件;
步骤S220.调用所述数据查询组件的预设接口生成迭代器对象;
步骤S230.通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回。
在本公开示例实施方式所提供的数据加载方法中,通过接收到数据加载请求时,创建数据查询组件;调用所述数据查询组件的预设接口生成迭代器对象;通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回。一方面,通过数据查询组件生成迭代器对象后,可以通过迭代器对象执行分片数据的加载逻辑实现分片数据的加载,无需引入大数据组件加载分片数据或者通过切换数据库表查询分片数据,降低了分片数据加载的复杂度,从而提高了离线数据处理任务的开发效率。同时,通过迭代器对象加载分片数据可以实现数据加载服务与业务系统解耦,使得整个数据加载过程对业务开发者是透明的,即业务开发者不需要关注迭代器对象内部复杂的加载逻辑,只需要关注业务逻辑的开发,进一步提高了离线数据处理任务的开发效率;另一方面,数据查询组件中封装的分片数据加载逻辑可以适用于所有的数据处理任务,无需针对每个数据处理任务重新开发对应的分片数据加载逻辑,扩展性较高。
下面,对于本示例实施方式的上述步骤进行更加详细的说明。
在步骤S210中,接收到数据加载请求时,创建数据查询组件。
本公开示例实施方式中,可以以加载分片数据为例进行说明。例如,对于常见的单库单表,数据库中存储有一张用户(user)表,所有的用户都可以在该user表中查询到。当用户数量达到一定数目时,为了不影响数据库的性能,可以将该user表进行切分,通过单库多表的方式存储数据。进一步的,当单个数据库的存储空间不够时,也可以对数据库进行拆分,通过多库多表的方式存储数据。因此,不同数据库/不同表中包含的数据仅为之前一个数据库/一个表中数据的一部分,即数据分片。对应的,本公开示例实施方式中的分片数据可以是指将一个数据库中的数据分到不同数据库的分库数据,也可以是指将一个表中的数据分到不同表中的分表数据,还可以是分库分表数据,本公开对此不做具体限定。
加载分片数据之前,可以基于JDBC(Java DataBase Connectivity,java数据库连接)协议将分片数据加载逻辑进行封装得到数据查询组件,以通过数据查询组件访问数据库并加载分片数据。其中,JDBC是一种用于执行SQL(Structured Query Language,结构化查询语言,一种对数据库进行操作的语言)语句的Java API(Application ProgrammingInterface,应用程序接口),可以为多种关系数据库提供统一访问。使用JDBC协议可以实时从数据库获取分片数据,对分片数据进行不同的参数化处理后,脚本在运行时可以根据需要引用参数名作为输入,从而实现不同场景的使用。示例性的,可以将封装得到的数据查询组件打包成jar文件,并通过maven坐标引入该jar文件进行数据加载,其中,maven坐标可以用来唯一标识每个jar文件。
为了便于加载指定的分片数据,还可以定义一个Config配置对象,用于接收查询参数,可以通过查询参数控制数据加载的过程。查询参数可以包括数据源(DataSource)、逻辑数据层(LogicDataLayer)、起始表下标(StartIndex)、结束表下标(EndIndex)、是否填充0(PaddingZeroLeft)、表下标位数(TableIndexLength)。其中,数据源即数据来源,通过数据源可以连接到数据库进行数据读取。逻辑数据层可以将所有的逻辑数据源整合到一起,封装了逻辑数据源切换的逻辑。每个逻辑数据源中可以包括数据源的数据库信息、数据表信息和读取索引等,读取索引又可以包括起始表下标、结束表下标、是否填充0和表下标位数等信息。
举例而言,共有1000张数据表(table),第一张表命名为table_0001,最后一张表命名为table_1000,对应的,起始表下标即为1,结束表下标即为1000。是否填充0可以表示当前是否需要填0,例如,对于第一张表,可以命名为table_1,如果选择了填0,第一张表的命名则可以变为table_0001。表下标位数可以表示数据表的索引长度。例如,table_0001表示表下标位数为4,table_00001表示表下标位数为5,若配置的表下标位数为5时,位数不足的要填充到5位。通过读取索引信息可以控制数据加载的过程,例如,数据库只有100张数据表时,若没有结束表索引,那么加载到第101张表时,就会进行异常报错。
一种示例实施方式中,当接收到数据加载请求时,可以根据该数据加载请求创建一个数据查询组件。具体地,可以接收数据加载请求中的查询参数,根据查询参数创建对应的组件实例,并对组件实例进行配置得到数据查询组件,数据查询组件可以配置有原始查询语句(OriginSql)、分片数据属性信息和对象映射器(ObjectMapper)等。其中,原始查询语句可以是原始SQL语句,指的是未分库分表前的查询语句,即查询语句中不包含表的索引。例如,分库分表之后从1库1表查询的语句为select*from t_1,对应的原始SQL即为select*from t。分片数据属性信息可以包括里程碑属性名(或水位,MilestoneName)和里程碑初始值(或水位初始值,MilestoneInitValue)等信息,里程碑属性名可以用于切换数据查询水位,里程碑初始值可以用于首次查询时筛选数据。对象映射器可以将查询结果封装为JavaBean对象(Java语言中的对象,通常只有属性,不对外提供复杂的方法),供业务代码使用。
示例性的,可以通过Config配置对象接收数据加载请求中的查询参数,包括数据源、逻辑数据层、起始表下标、结束表下标、是否填充0、表下标位数等参数。根据不同的查询参数创建对应的组件实例,也就是说每次进行数据加载时都需要创建一个新的组件实例,即Component组件实例,Component组件实例是一个轻量级的对象,可以用于实际执行数据加载操作。创建Component组件实例时可以传入里程碑属性名、里程碑初始值、原始SQL语句和对象映射器。例如,需要加载1000条数据(id从1到1000)且当前加载到第500条数据时,500即为里程碑属性名,加载的第一条数据的id为1,1即为里程碑初始值。数据查询的底层可以通过SQL进行,例如,原始SQL语句为select*from user,进行数据查询时可以在SQL语句中添加里程碑信息,SQL语句可以变为select*from user order by id limit 500,100。其中,limit 500,100表示从第500条数据开始加载100条数据,从而可以快速找到当前访问的目标分片数据。
对创建的Component组件实例进行配置之前,还可以配置数据源、逻辑数据源对象和逻辑数据层对象,以利用数据查询组件根据配置好的数据源、逻辑数据源对象和逻辑数据层对象进行数据加载。示例性的,可以配置JDBC协议数据源,其支持HikariCP、DBCP、C3P0、Druid等数据库连接池。具体地,可以配置数据库用户名、数据库链接、数据库密码、数据库目标库和超时时间等。本公开示例实施方式中配置逻辑数据源对象属性可以包括数据源、表索引集合、起始表索引、结束表索引、左边是否填0、表索引位数和逻辑数据源名称等。完成逻辑数据源配置之后,可以将所有的逻辑数据源整合到一起,得到逻辑数据层对象。示例性的,可以通过数据查询组件访问配置好的数据库并根据配置好的逻辑数据源对象属性加载目标分片数据。
本公开示例实施方式中的数据查询组件基于JDBC协议封装了数据加载逻辑,通过简单配置即可遍历所有分片中符合条件的数据,不需要引入大数据组件,也不需要通过手工切换数据库表进行查询,降低了分片数据加载的复杂度。
在步骤S220中,调用所述数据查询组件的预设接口生成迭代器对象。
创建数据查询组件后,数据查询组件不会自动进行查询,可以调用数据查询组件对外暴露的预设接口生成迭代器对象(也可称为迭代器,Iterator),进而利用迭代器对象获取数据。本公开示例实施方式中的迭代器对象中封装有分片数据加载逻辑,可以维护当前查询的库表信息和当前查询的数据水位,也可以在分片数据加载过程中对数据源、库表、水位进行切换,还可以对外提供数据查询接口,数据查询接口内部封装了Query查询对象,Query查询对象是实际数据查询操作的执行器,其内部封装有数据查询组件、SQL解析器和对象映射器,SQL解析器可以用于解析SQL语句,并根据解析结果改写当前查询的库表和水位。其中,迭代器提供了同意遍历操作集合元素的统一接口,是一种可以被next()函数调用并不断返回下一个值的对象,可以从集合的第一个元素开始访问,直到所有的元素被访问完,整个遍历过程不能回退访问前一个元素。一个迭代器可以包含iter()方法和next()方法。iter()方法可以返回一个特殊的迭代器对象,这个迭代器对象可以实现next()方法并通过StopIteration(在循环对象穷尽所有元素时的报错)异常标识迭代的完成。
本公开示例实施方式中,数据查询组件的预设接口可以包括第一接口和第二接口两种。例如,可以调用数据查询组件的第一接口,返回第一迭代器对象,该第一迭代器对象可以用于加载单个分片数据。其中,第一接口可以是open接口,第一迭代器对象可以是Iterator迭代器。对应的,可以通过调用open方法,开启加载单条数据,返回Iterator迭代器。也可以调用数据查询组件的第二接口,返回第二迭代器对象,该第二迭代器对象可以用于加载批量分片数据。其中,第二接口可以是openBatch接口,第二迭代器对象可以是BatchIterator迭代器。对应的,可以通过调用openBatch方法,开启批次加载数据,返回BatchIterator迭代器。数据查询组件通过提供单条数据和批次数据遍历的接口,从而可以满足多种业务场景,即单条数据处理的场景和批量数据处理的场景。
在步骤S230中,通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回。
迭代器的使用可以包括三点注意事项:1)使用容器的iter()方法返回一个Iterator,然后通过next()方法返回第一个元素;2)使用Iter()的hasNext()方法判断容器中是否还有元素,如果有,可以使用next()方法获取下一个元素;3)可以通过remove()方法删除迭代器返回的元素。
一种示例实施方式中,参考图3所示,可以根据步骤S310和步骤S320通过迭代器对象获取目标分片数据。
步骤S310.通过所述迭代器对象对所述原始查询语句进行预编译,得到目标查询语句。
示例性的,可以调用迭代器对象的数据查询接口,数据查询接口中封装有Query查询对象,Query查询对象是实际数据查询操作的执行器,其内部封装有数据查询组件、SQL解析器和对象映射器。进一步的,可以基于分片数据属性信息,通过数据查询接口对原始查询语句进行预编译,得到目标查询语句。例如,原始SQL语句为select*from user,分片数据属性信息可以包括里程碑信息,将里程碑信息传入原始SQL语句中得到目标查询语句也就是预编译的SQL语句,如为select*from user order by id limit 500,100,表示从第500条数据开始加载100条数据,其中,order by id limit 500,100即为传入的里程碑信息。
步骤S320.通过所述目标查询语句得到所述目标分片数据,并将所述目标分片数据以预设数据格式返回。
得到预编译的查询语句后,可以通过PreparedStatement、ResultSet等对象,完成数据查询并封装为对象的过程。其中,PreparedStatement对象继承于Statement对象,SQL语句被预编译并存储在PreparedStatement对象中,可以使用PreparedStatement对象多次高效地执行预编译的SQL语句进行数据库查询,并返回ResultSet对象,类似于返回查询结果集的一张数据表。
示例性的,可以利用目标查询语句遍历迭代器对象,得到目标分片数据,利用对象映射器将目标分片数据进行封装,并返回封装后的目标分片数据。具体地,通过执行预编译的查询语句,可以根据查询语句中的里程碑信息返回对应的目标分片数据。查询过程中,可以利用SQL解析器改写当前查询的库表和水位,并利用对象映射器将查询结果封装为预设数据格式。例如,预编译的SQL语句为select*from user order by id limit 500,100时,可以查询并加载目标数据库中从第500条数据开始的100条数据,并将这100条数据映射为JavaBean对象。然后,可以调用迭代器对象的next()方法,返回经过对象映射器封装后的数据。
一种示例实施方式中,对于单条数据处理的场景。每次查询得到一条数据后,可以逐条进行处理,具体处理过程如下:
或者,
Iterator<T>iterator=component.open();
while(iterator.hasNext()){
T object=iterator.next();
//TODO针对查询出来的object进行相应处理
System.out.println(object);
}
另一种示例实施方式中,对于批量数据处理的场景。每次查询得到一批数据后,可以逐批进行处理,处理完之后再返回处理下一批数据,也可以并发进行处理,以提高处理效率。具体处理过程如下:
或者,
BatchIterator<Object>batchIterator=component.openBatch();
while(batchIterator.hasNext()){
List<Object>objects=batchIterator.next();
//TODO针对查询出来的列表进行相应处理
System.out.println(objects);
}
参考图4所示,示意性的给出了一种透明的分片数据加载装置结构图,也就是使用者不需要关心业务系统内部复杂的加载逻辑,加载过程对使用者是透明的。具体地,分片数据加载装置包括Config配置对象、Component组件实例和迭代器对象。其中,对Config配置对象和Component组件实例进行配置后,可以调用组件对外暴露的预设接口生成迭代器对象,进而可以通过迭代器对象获取数据。迭代器对象可以对外提供数据查询接口,数据查询接口内部封装了Query查询对象,Query查询对象是实际数据查询操作的执行器,其内部封装有数据查询组件、SQL解析器和对象映射器。
基于图4中的分片数据加载装置,参考图5所示,可以根据步骤S510至步骤S540进行数据加载。
步骤S510.引入组件:可以通过maven坐标引入依赖的jar文件;
步骤S520.配置组件:可以配置逻辑数据层、逻辑数据库、组件实例对象等。
步骤S530.调用组件对外暴露的接口:可以通过open方法,开启加载单条数据,返回Iterator迭代器。或者,可以通过openBatch方法开启批次加载数据,返回BatchIterator迭代器。两种不同的迭代器,分别对应单条数据加载和批次数据加载的场景;
步骤S540.利用组件加载数据并返回:可以通过步骤S430中返回的迭代器取出组件加载的数据,以将取出的数据用于业务处理。
该示例中,业务系统可以直接引入数据查询组件,即可对分片数据进行加载,使业务系统只需要关注业务处理逻辑,不需要再关注数据加载的过程,不仅提高了开发效率,而且提高了代码质量。
其中,步骤S520又可以包括步骤S610至步骤S640,参考图6所示,示意性的给出了分片数据加载装置的配置过程,即对Config配置对象和Component组件实例进行配置的过程。具体地:
在步骤S610中,配置数据源;
示例性的,可以配置JDBC协议数据源,其支持HikariCP、DBCP、C3P0、Druid等数据库连接池。具体地,可以配置数据库用户名、数据库链接、数据库密码、数据库目标库和超时时间等。
在步骤S620中,配置逻辑数据源对象;
配置逻辑数据源对象属性可以包括数据源、表索引集合、起始表索引、结束表索引、左边是否填0、表索引位数和逻辑数据源名称等。
在步骤S630中,配置逻辑数据层对象;
完成逻辑数据源配置之后,可以将所有的逻辑数据源整合到一起,得到逻辑数据层对象。
在步骤S640中,配置查询组件,包括配置原始SQL语句、配置水位属性名、配置对象映射器和配置水位初始值。
每次进行数据加载时都需要创建一个新的Component组件实例,对Component组件实例进行配置需要在创建Component组件实例时传入水位(里程碑)属性名、水位初始值、原始SQL语句和对象映射器。
对应于图4所示的分片数据加载装置,参考图7所示,可以根据步骤S710至步骤S770进行数据加载。
步骤S710.接收业务数据加载请求:发起数据加载的过程;
步骤S720.创建查询组件对象:针对接收到的每个数据加载请求,都对应的创建一个数据查询组件对象,完成数据查询之后会自动销毁;
步骤S730.调用open/openBatch方法开启查询:为使查询过程更定制化,创建查询组件对象之后不会自动进行查询,需要调用open/openBatch方法进行开启;
步骤S740.生成迭代器对象:迭代器对象包含了完整的数据加载逻辑,可用多种方式进行迭代,如单个数据迭代、批量数据迭代等。
步骤S750.判断迭代器是否有值:通过判断迭代器是否有值来确定是否继续加载处理数据,若迭代器中有值,执行步骤S660,若迭代器中没有值,则结束加载流程;
步骤S760.取出数据:调用迭代器的next方法,返回经过对象映射器封装后的数据。
步骤S770.业务逻辑处理:对取出的数据进行处理,并依次处理下个/批数据,直至迭代器中没有值。
该示例中,通过该装置可以对分库分表的数据进行透明的加载,业务开发者只需要关注业务逻辑的开发,不需要引入大数据组件,也不再需要手工切换数据库表进行查询,极大地降低了分片数据加载的复杂度,提高了开发效率,提高了代码质量。
在本公开示例实施方式所提供的数据加载方法中,通过接收到数据加载请求时,创建数据查询组件;调用所述数据查询组件的预设接口生成迭代器对象;通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回。一方面,通过数据查询组件生成迭代器对象后,可以通过迭代器对象执行分片数据的加载逻辑实现分片数据的加载,无需引入大数据组件加载分片数据或者通过切换数据库表查询分片数据,降低了分片数据加载的复杂度,从而提高了离线数据处理任务的开发效率。同时,通过迭代器对象加载分片数据可以实现数据加载服务与业务系统解耦,使得整个数据加载过程对业务开发者是透明的,即业务开发者不需要关注迭代器对象内部复杂的加载逻辑,只需要关注业务逻辑的开发,进一步提高了离线数据处理任务的开发效率;另一方面,数据查询组件中封装的分片数据加载逻辑可以适用于所有的数据处理任务,无需针对每个数据处理任务重新开发对应的分片数据加载逻辑,扩展性较高。
应当注意,尽管在附图中以特定顺序描述了本公开中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。
进一步的,本示例实施方式中,还提供了一种数据加载装置,该装置可以应用于一服务器或终端设备。参考图8所示,该数据加载装置800可以包括组件创建模块810、对象生成模块820和数据加载模块830,其中:
组件创建模块810,用于接收到数据加载请求时,创建数据查询组件;
对象生成模块820,用于调用所述数据查询组件的预设接口生成迭代器对象;
数据加载模块830,用于通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回。
在一种可选的实施方式中,组件创建模块810包括:
参数接收单元,用于接收所述数据加载请求中的查询参数;
组件创建单元,用于根据所述查询参数创建对应的组件实例;
组件配置单元,用于对所述组件实例进行配置得到所述数据查询组件,所述数据查询组件配置有原始查询语句、分片数据属性信息和对象映射器。
在一种可选的实施方式中,对象生成模块820包括:
第一迭代器生成单元,用于调用所述数据查询组件的第一接口,返回第一迭代器对象,所述第一迭代器对象用于加载单个分片数据;
第二迭代器生成单元,用于调用所述数据查询组件的第二接口,返回第二迭代器对象,所述第二迭代器对象用于加载批量分片数据。
在一种可选的实施方式中,数据加载模块830包括:
查询语句编译模块,用于通过所述迭代器对象对所述原始查询语句进行预编译,得到目标查询语句;
分片数据加载模块,用于通过所述目标查询语句得到所述目标分片数据,并将所述目标分片数据以预设数据格式返回。
在一种可选的实施方式中,查询语句编译模块包括:
查询接口调用单元,用于调用所述迭代器对象的数据查询接口;
查询语句编译单元,用于基于所述分片数据属性信息,通过所述数据查询接口对所述原始查询语句进行预编译,得到目标查询语句。
在一种可选的实施方式中,分片数据加载模块包括:
查询接口调用单元,用于利用所述目标查询语句遍历所述迭代器对象,得到所述目标分片数据;
查询语句编译单元,用于利用所述对象映射器将所述目标分片数据进行封装,并返回封装后的目标分片数据。
在一种可选的实施方式中,数据加载装置800还包括:
数据配置模块,用于配置数据源、逻辑数据源对象和逻辑数据层对象,以利用所述数据查询组件根据配置好的数据源、逻辑数据源对象和逻辑数据层对象进行数据加载。
上述数据加载装置中各模块的具体细节已经在对应的数据加载方法中进行了详细的描述,因此此处不再赘述。
上述装置中各模块可以是通用处理器,包括:中央处理器、网络处理器等;还可以是数字信号处理器、专用集成电路、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。各模块也可以由软件、固件等形式来实现。上述装置中的各处理器可以是独立的处理器,也可以集成在一起。
本公开的示例性实施方式还提供了一种计算机可读存储介质,其上存储有能够实现本说明书上述方法的程序产品。在一些可能的实施方式中,本公开的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当程序产品在电子设备上运行时,程序代码用于使电子设备执行本说明书上述“示例性方法”部分中描述的根据本公开各种示例性实施方式的步骤。该程序产品可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在电子设备,例如个人电脑上运行。然而,本公开的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本公开操作的程序代码,程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
本公开的示例性实施方式还提供了一种能够实现上述方法的电子设备。下面参照图9来描述根据本公开的这种示例性实施方式的电子设备900。图9显示的电子设备900仅仅是一个示例,不应对本公开实施方式的功能和使用范围带来任何限制。
如图9所示,电子设备900可以以通用计算设备的形式表现。电子设备900的组件可以包括但不限于:至少一个处理单元910、至少一个存储单元920、连接不同系统组件(包括存储单元920和处理单元910)的总线930和显示单元940。
存储单元920存储有程序代码,程序代码可以被处理单元910执行,使得处理单元910执行本说明书上述“示例性方法”部分中描述的根据本公开各种示例性实施方式的步骤。例如,处理单元910可以执行图2至图7中任意一个或多个方法步骤。
存储单元920可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(RAM)921和/或高速缓存存储单元922,还可以进一步包括只读存储单元(ROM)923。
存储单元920还可以包括具有一组(至少一个)程序模块925的程序/实用工具924,这样的程序模块925包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
总线930可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。
电子设备900也可以与一个或多个外部设备1000(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备900交互的设备通信,和/或与使得该电子设备900能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口950进行。并且,电子设备900还可以通过网络适配器960与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器960通过总线930与电子设备900的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备900使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
在一些实施例中,可以由电子设备的处理单元910执行本公开中所述的数据加载方法。在一些实施例中,可以通过输入接口950输入所有的业务数据。例如,通过电子设备的用户交互界面输入业务数据。在一些实施例中,可以通过输出接口950将加载的指定业务数据输出至外部设备1000以供用户查看。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本公开示例性实施方式的方法。
此外,上述附图仅是根据本公开示例性实施方式的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
Claims (10)
1.一种数据加载方法,其特征在于,包括:
接收到数据加载请求时,创建数据查询组件;
调用所述数据查询组件的预设接口生成迭代器对象;
通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回。
2.根据权利要求1所述的数据加载方法,其特征在于,所述接收到数据加载请求时,创建数据查询组件,包括:
接收所述数据加载请求中的查询参数;
根据所述查询参数创建对应的组件实例;
对所述组件实例进行配置得到所述数据查询组件,所述数据查询组件配置有原始查询语句、分片数据属性信息和对象映射器。
3.根据权利要求1所述的数据加载方法,其特征在于,所述调用所述数据查询组件的预设接口生成迭代器对象,包括:
调用所述数据查询组件的第一接口,返回第一迭代器对象,所述第一迭代器对象用于加载单个分片数据;或者
调用所述数据查询组件的第二接口,返回第二迭代器对象,所述第二迭代器对象用于加载批量分片数据。
4.根据权利要求2所述的数据加载方法,其特征在于,所述通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回,包括:
通过所述迭代器对象对所述原始查询语句进行预编译,得到目标查询语句;
通过所述目标查询语句得到所述目标分片数据,并将所述目标分片数据以预设数据格式返回。
5.根据权利要求4所述的数据加载方法,其特征在于,所述通过所述迭代器对象对所述原始查询语句进行预编译,得到目标查询语句,包括:
调用所述迭代器对象的数据查询接口;
基于所述分片数据属性信息,通过所述数据查询接口对所述原始查询语句进行预编译,得到目标查询语句。
6.根据权利要求4所述的数据加载方法,其特征在于,所述通过所述目标查询语句得到所述目标分片数据,并将所述目标分片数据以预设数据格式返回,包括:
利用所述目标查询语句遍历所述迭代器对象,得到所述目标分片数据;
利用所述对象映射器将所述目标分片数据进行封装,并返回封装后的目标分片数据。
7.根据权利要求1所述的数据加载方法,其特征在于,所述方法还包括:
配置数据源、逻辑数据源对象和逻辑数据层对象,以利用所述数据查询组件根据配置好的数据源、逻辑数据源对象和逻辑数据层对象进行数据加载。
8.一种数据加载装置,其特征在于,包括:
组件创建模块,用于接收到数据加载请求时,创建数据查询组件;
对象生成模块,用于调用所述数据查询组件的预设接口生成迭代器对象;
数据加载模块,用于通过所述迭代器对象加载目标分片数据,并将所述目标分片数据以预设数据格式返回。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1-7任一项所述的方法。
10.一种电子设备,其特征在于,包括:
处理器;以及
存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1-7任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210120492.2A CN114461716A (zh) | 2022-02-07 | 2022-02-07 | 数据加载方法、装置、存储介质及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210120492.2A CN114461716A (zh) | 2022-02-07 | 2022-02-07 | 数据加载方法、装置、存储介质及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114461716A true CN114461716A (zh) | 2022-05-10 |
Family
ID=81413545
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210120492.2A Pending CN114461716A (zh) | 2022-02-07 | 2022-02-07 | 数据加载方法、装置、存储介质及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114461716A (zh) |
-
2022
- 2022-02-07 CN CN202210120492.2A patent/CN114461716A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP7271734B2 (ja) | 分散イベント処理システムにおけるデータシリアライズ | |
US11797558B2 (en) | Generating data transformation workflows | |
US9298774B2 (en) | Changing the compression level of query plans | |
US8005818B2 (en) | Apparatus and method for maintaining metadata version awareness during set evaluation for OLAP hierarchies | |
CN109491989B (zh) | 数据处理方法及装置、电子设备、存储介质 | |
CN111061739B (zh) | 海量医疗数据的入库方法及装置、电子设备、存储介质 | |
WO2023221408A1 (zh) | 深度学习框架的算子处理方法、装置、设备和存储介质 | |
CN107766526B (zh) | 数据库访问方法、装置及系统 | |
US20210209098A1 (en) | Converting database language statements between dialects | |
US10157234B1 (en) | Systems and methods for transforming datasets | |
CN111949693B (zh) | 一种数据处理装置、数据处理方法、存储介质及电子设备 | |
US8489580B2 (en) | Query optimization | |
JP2012113706A (ja) | データベース・クエリ最適化のためのコンピュータで実装される方法、コンピュータ・プログラム、およびデータ処理システム | |
CN112949269A (zh) | 可视化数据分析报表的生成方法、系统、设备及存储介质 | |
CN113760948A (zh) | 一种数据查询的方法及装置 | |
US20150356131A1 (en) | Accessing an external table in parallel to execute a query | |
CN114116678A (zh) | 数据迁移方法、装置、设备、介质及程序产品 | |
US11693859B2 (en) | Systems and methods for data retrieval from a database indexed by an external search engine | |
CN113918602A (zh) | 一种数据缓存方法、装置和电子设备 | |
US8200673B2 (en) | System and method for on-demand indexing | |
US9280582B2 (en) | Optimization of join queries for related data | |
CN115292313A (zh) | 一种伪列实现方法、装置、电子设备及存储介质 | |
US11847121B2 (en) | Compound predicate query statement transformation | |
CN114461716A (zh) | 数据加载方法、装置、存储介质及电子设备 | |
US11347732B1 (en) | JSON persistence service |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |