CN115994148A - 多表数据的更新方法、装置、电子设备及可读存储介质 - Google Patents
多表数据的更新方法、装置、电子设备及可读存储介质 Download PDFInfo
- Publication number
- CN115994148A CN115994148A CN202111223531.3A CN202111223531A CN115994148A CN 115994148 A CN115994148 A CN 115994148A CN 202111223531 A CN202111223531 A CN 202111223531A CN 115994148 A CN115994148 A CN 115994148A
- Authority
- CN
- China
- Prior art keywords
- target
- data
- identifier
- file
- updating
- 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
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请提供一种多表数据的更新方法、装置、电子设备及计算机可读存储介质。该多表数据的更新方法包括:当Flink读取到源端的待处理数据时,基于待处理数据中携带的目标源表标识获取待处理数据的目标有效字段;更新Flink的算子状态中与目标记录标识关联记录的目标文件标识,得到与目标记录标识关联记录的更新后文件标识;将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务;当符合预设的更新条件时,通过目标子任务,根据更新后文件标识关联的目标宽表文件中的历史宽表数据以及目标有效字段,更新目标宽表文件得到更新后的目标宽表文件。本申请中可以有效针对局部字段数据进行更新,从而有效地对宽表数据写入。
Description
技术领域
本申请涉及大数据技术领域,具体涉及一种多表数据的更新方法、装置、电子设备及计算机可读存储介质。
背景技术
结构化查询语言(Structured Query Language,SQL)的处理作业中,通常会涉及到多表合并成一张宽表的作业,即job操作,Join操作的目的是对表数据进行扩展。例如,将表t0=(id,name)和表t1=(id,age)进行合并成一张宽表t_p(id,name,age);其中,多表合并为宽表时一般会区分左表和右表,如表t0作为左表、t1作为右表。
现有技术中,通过在Flink框架中实现Join操作完成宽表数据写入。然而,事实数据是源源不断地流入到Kafka中,Flink框架中实现Join操作时会将左表和右表的全量数据都缓存写入state中,因此在Flink框架中实现Join操作会给state的保存带来一定的存储压力。其中,事实数据可能是来自于网页中的用户访问日志、也有可能是MySQL中进行操作的binlog日志。
Hudi是一个数据的写入工具包,Hudi的COW写入模式是一种可靠写入方式,其可以有效降低地state的存储压力。但是,Hudi的COW写入模式下会用最新的字段数据全面覆盖老的字段数据,无法有效针对局部字段数据进行更新,因此无法有效地对宽表数据写入。
发明内容
本申请提供一种多表数据的更新方法、装置、电子设备及计算机可读存储介质,旨在解决由于Hudi的COW写入模式下会用最新的字段数据全面覆盖老的字段数据,无法有效针对局部字段数据进行更新,因此无法有效地对宽表数据写入的问题。
第一方面,本申请提供一种多表数据的更新方法,所述方法包括:
当Flink读取到源端的待处理数据时,基于所述待处理数据中携带的目标源表标识获取所述待处理数据的目标有效字段,其中,所述待处理数据中还携带有目标记录标识;
更新所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识,得到与所述目标记录标识关联记录的更新后文件标识;
将所述目标有效字段下发至Hudi层中与所述更新后文件标识对应的目标子任务;
当符合预设的更新条件时,通过所述目标子任务,根据所述更新后文件标识关联的目标宽表文件中的历史宽表数据以及所述目标有效字段,更新所述目标宽表文件得到更新后的目标宽表文件。
第二方面,本申请提供一种多表数据的更新装置,所述多表数据的更新装置包括:
获取单元,用于当Flink读取到源端的待处理数据时,基于所述待处理数据中携带的目标源表标识获取所述待处理数据的目标有效字段,其中,所述待处理数据中还携带有目标记录标识;
标识更新单元,用于更新所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识,得到与所述目标记录标识关联记录的更新后文件标识;
下发单元,用于将所述目标有效字段下发至Hudi层中与所述更新后文件标识对应的目标子任务;
数据更新单元,用于当符合预设的更新条件时,通过所述目标子任务,根据所述更新后文件标识关联的目标宽表文件中的历史宽表数据以及所述目标有效字段,更新所述目标宽表文件得到更新后的目标宽表文件。
在本申请一种可能的实现方式中,所述获取单元具体用于:
对所述待处理数据进行解析,得到所述待处理数据的目标全字段,其中,所述目标全字段包含所述待处理数据的目标源表标识;
根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,确定所述目标有效字段。
在本申请一种可能的实现方式中,所述算子状态中用于记录右表流数据,所述获取单元具体用于:
根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,得到所述待处理数据的初步有效字段;
当所述待处理数据的流数据类型为右表流数据时,根据所述初步有效字段,更新所述算子状态中与所述目标记录标识关联记录的右表流数据,得到更新后右表流数据;
将所述更新后右表流数据作为所述目标有效字段。
在本申请一种可能的实现方式中,所述根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,确定所述目标有效字段之前,所述获取单元具体用于:
基于所述待处理数据中携带的目标分区标识,以及预设的分区标识与流数据类型之间的第二映射关系,确定所述待处理数据的流数据类型。
在本申请一种可能的实现方式中,所述待处理数据中还携带有目标分区标识,所述标识更新单元具体用于:
检测所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识是否为空值;
当所述目标文件标识为空值时,将所述目标分区标识与所述目标记录标识关联记录至所述算子状态中;
将所述目标分区标识作为所述更新后文件标识。
在本申请一种可能的实现方式中,所述待处理数据中还携带有目标分区标识,所述标识更新单元具体用于:
检测所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识与所述目标分区标识是否相同;
若所述目标文件标识与所述目标分区标识不同,则将所述目标文件标识更新为所述目标分区标识;
将所述目标分区标识作为所述更新后文件标识。
在本申请一种可能的实现方式中,所述标识更新单元具体用于:
检测所述待处理数据是否为待删除状态;
若所述待处理数据为待删除状态,则将所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识设置为空值;
将为空值的所述目标文件标识作为所述更新后文件标识。
在本申请一种可能的实现方式中,所述目标有效字段包括所述目标记录标识和所述待处理数据的目标数据内容,所述数据更新单元具体用于:
通过所述目标子任务,检测所述历史宽表数据中是否包含与所述目标记录标识对应的目标历史宽表数据;
当所述历史宽表数据中包含所述目标历史宽表数据时,采用所述目标数据内容更新所述目标历史宽表数据,得到所述目标记录标识关联的第一目标宽表数据;
将所述第一目标宽表数据写回所述目标宽表文件,得到更新后的目标宽表文件。
在本申请一种可能的实现方式中,所述通过所述目标子任务,检测所述历史宽表数据中是否包含与所述目标记录标识对应的目标历史宽表数据的步骤之后,所述数据更新单元具体用于:
当所述历史宽表数据中不包含所述目标历史宽表数据时,生成与所述目标记录标识关联的模板宽表数据;
将所述目标数据内容和所述模板宽表数据进行合并,得到所述目标记录标识关联的第二目标宽表数据;
将所述第二目标宽表数据写回所述目标宽表文件,得到更新后的目标宽表文件。
第三方面,本申请还提供一种电子设备,所述电子设备包括处理器和存储器,所述存储器中存储有计算机程序,所述处理器调用所述存储器中的计算机程序时执行本申请提供的任一种多表数据的更新方法中的步骤。
第四方面,本申请还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器进行加载,以执行所述的多表数据的更新方法中的步骤。
本申请当Flink读取到源端的待处理数据时,基于待处理数据中携带的目标源表标识获取待处理数据的目标有效字段;更新Flink的算子状态中与目标记录标识关联记录的目标文件标识,得到与目标记录标识关联记录的更新后文件标识;将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务;当符合预设的更新条件时,通过目标子任务,根据更新后文件标识关联的目标宽表文件中的历史宽表数据以及目标有效字段,更新目标宽表文件得到更新后的目标宽表文件。第一方面,由于是通过提取目标有效字段对目标历史宽表数据进行更新,因此可以只选择有效字段的更新,从而达到局部更新的效果,避免了Hudi的COW写入模式下会用最新的字段数据全面覆盖老的字段数据而导致无法有效针对局部字段数据进行更新的问题,实现有效地对宽表数据写入。第二方面,通过将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务,实现将宽表更新下发至Hudi层去实现,使得Flink中的算子状态无需存储全量的左表流数据和右表流数据,从而降低Flink中的算子状态的数据存储量,可以有效降低地state的存储压力。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例所提供的多表数据的更新系统的场景示意图;
图2是本申请实施例提供的多表数据的更新方法的一种流程示意图;
图3是本申请实施例中提供的多表数据更新的一种流转说明示意图;
图4是本申请实施例中提供的基于Hudi写入数据的一种算子流转示意图;
图5是本申请实施例的目标历史宽表数据替换的一种说明示意图;
图6是本申请实施例中提供的目标历史宽表数据合并的一种说明示意图;
图7是本申请实施例中提供的多表数据的更新装置的一个实施例结构示意图;
图8是本申请实施例中提供的电子设备的一个实施例结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在本申请实施例的描述中,需要理解的是,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个所述特征。在本申请实施例的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
为了使本领域任何技术人员能够实现和使用本申请,给出了以下描述。在以下描述中,为了解释的目的而列出了细节。应当明白的是,本领域普通技术人员可以认识到,在不使用这些特定细节的情况下也可以实现本申请。在其它实例中,不会对公知的过程进行详细阐述,以避免不必要的细节使本申请实施例的描述变得晦涩。因此,本申请并非旨在限于所示的实施例,而是与符合本申请实施例所公开的原理和特征的最广范围相一致。
首先,在介绍本申请实施例之前,先介绍下本申请实施例关于应用背景的相关内容。
Apache Hudi用于基于分布式文件系统(HDFS或云存储)接收和管理大型分析数据集的存储,是一个数据湖Data Lakes的开源方案。Hudi将DFS上的数据集组织到基本路径下的目录结构中。数据集分为多个分区,这些分区是包含该分区的数据文件的文件夹。Hudi可提供类似于时序数据库的功能,每次提交都有一个时间,可以查询每个时间点的数据,也可以根据提交时间查询一段时间内的增量。Hudi可提供从不同时间点出发得到不同的视图下的数据集。主要特性是支持增量读取和更新插入。
Hudi提供两种存储类型,分别为写时复制和读时合并。写时复制存储类型仅使用列文件格式(例如parquet)存储数据,通过在写入过程中执行同步合并以更新版本并重写文件。读时合并存储类型使用列式(例如parquet)+基于行(例如avro)的文件格式组合来存储数据,更新记录到增量文件中,然后进行同步或异步压缩以生成列文件的新版本。
Hudi可以通过Hive SQL或Spark SQL执行引擎(统称为SQL执行引擎)进行全量和增量查询,但是写入操作只能通过Spark Datasource API执行引擎进行操作,然后通过同步的方式,把表属性信息和分区信息同步到Hive表中,但是Hudi表内置了一些字段,例如以“_hoodie”开头的字段是Hudi表内置的字段,这些字段在Hive SQL执行涉及写入操作的SQL语句(例如insert、update、delete)时,无法正常得到处理,即Hudi表还不支持SQL执行引擎执行涉及写入操作的SQL语句。
本申请实施例多表数据的更新方法的执行主体可以为本申请实施例提供的多表数据的更新装置,或者集成了该多表数据的更新装置的服务器设备、物理主机或者用户设备(User Equipment,UE)等不同类型的电子设备,其中,多表数据的更新装置可以采用硬件或者软件的方式实现,UE具体可以为智能手机、平板电脑、笔记本电脑、掌上电脑、台式电脑或者个人数字助理(Personal Digital Assistant,PDA)等终端设备。
该电子设备可以采用单独运行的工作方式,或者也可以采用设备集群的工作方式。
参见图1,图1是本申请实施例所提供的多表数据的更新系统的场景示意图。其中,该多表数据的更新系统可以包括电子设备100,电子设备100中集成有多表数据的更新装置。例如,该电子设备可以在当Flink读取到源端的待处理数据时,基于待处理数据中携带的目标源表标识获取待处理数据的目标有效字段,其中,待处理数据中还携带有目标记录标识;更新Flink的算子状态中与目标记录标识关联记录的目标文件标识,得到与目标记录标识关联记录的更新后文件标识;将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务;当符合预设的更新条件时,通过目标子任务,根据更新后文件标识关联的目标宽表文件中的历史宽表数据以及目标有效字段,更新目标宽表文件得到更新后的目标宽表文件。
另外,如图1所示,该多表数据的更新系统还可以包括存储器200,用于存储数据,如存储左表流数据、右表流数据。
需要说明的是,图1所示的多表数据的更新系统的场景示意图仅仅是一个示例,本申请实施例描述的多表数据的更新系统以及场景是为了更加清楚的说明本申请实施例的技术方案,并不构成对于本申请实施例提供的技术方案的限定,本领域普通技术人员可知,随着多表数据的更新系统的演变和新业务场景的出现,本发明实施例提供的技术方案对于类似的技术问题,同样适用。
下面,开始介绍本申请实施例提供的多表数据的更新方法,本申请实施例中以电子设备作为执行主体,为了简化与便于描述,后续方法实施例中将省略该执行主体。
参照图2,图2是本申请实施例提供的多表数据的更新方法的一种流程示意图。需要说明的是,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。该多表数据的更新方法包括步骤201~204,其中:
201、当Flink读取到源端的待处理数据时,基于所述待处理数据中携带的目标源表标识获取所述待处理数据的目标有效字段。
其中,所述待处理数据中还携带有所述待处理数据对应的目标记录标识和目标分区标识。
目标记录标识(记为id)是指用于识别待处理数据所关联对象的标识,例如,左表t0=(id=1,name=zs,partition=t0)的目标记录标识为“1”。
目标分区标识(记为partition)是指用于识别待处理数据所处分区的标识。例如,左表t0=(id=1,name=zs,partition=t0)的目标分区标识为“t0”。
其中,源端可以是例如Kafka,MySQLHive等。
待处理数据是Flink的源端中用于合并形成宽表的左表或右表流数据。
本申请实施例中,将Flink实现Join操作的逻辑改为在Hudi中实现Join操作的逻辑。但在Hudi的COW写入模式中,每次都用最新的数据去覆盖老的数据,缺乏局部字段更新能力,因此需要在Hudi的COW写入模式中只选择有效字段的更新以达到局部更新的效果。为了达到只选择有效字段的更新以达到局部更新的效果,本申请实施例中对Hudi源码实现逻辑进行了改造。首先,是将多个Left Join语句改成Union All语句,此时,会令流数据的字段格式需要保持一致,即需保持字段对齐,字段不足时采用null填充。
例如,假设有一张宽表t_p(id,name,age,sex,partition),其中,partition是分区字段,在Flink实现Join操作的逻辑下,其由3张表组成t0(id,name,partition)、t1(id,age)和t2(id,sex)LeftJoin组成,对应的SQL语句(本文中简称SQL语句1)如下:
“insert into t_p
Select
t0.id,t0.name,t1.age,t2.sex,t0.partition from t0
LeftJoin
t1 on t0.id=t1.id
LeftJoin
t2 on t0.id=t2.id”。
其中,t0称作为左表,t1、t2称作为右表。若在Hudi中实现Join操作的逻辑,需要把多个LeftJoin语句改成Union All语句,改成Union All语句后需要字段对齐,字段不足时采用null填充,对应的SQL语句(本文中简称SQL语句2)如下:
“insert into t_p
select
t0.id,t0.name,null as age,null as sex,t0.partition,'t0'as tableNamefrom t0
union all
select
t1.id null as name,t1.age,null as sex,'_empty_'as partition,'t1'astableName from t1
union all
select
t1.id null as name,null as age,t2.sex,'_empty_'as partition,'t2'astableName from t2”。
由于绝大部分场景中右流是不带实际分区的,如上述SQL语句2所示,所以本申请实施例中用一个empty来凑齐字段。
可见,改成Union All语句后,待处理数据为预设的字段格式,待处理数据的全字段具体依次包括记录标识、有效字段、分区标识。因此,对待处理数据进行解析可以解析出待处理数据中携带的各种字段信息,比如,记录标识、分区标识、有效字段等。如上SQL语句2所示,本申请实施例中在Union All语句中还增加了用于识别待处理数据的来源表的“tableName”字段,此时,步骤201中获取待处理数据的目标有效字段具体可以包括步骤2011~2022,其中:
2011、对所述待处理数据进行解析,得到所述待处理数据的目标全字段。
其中,所述目标全字段包含所述待处理数据的目标源表标识。
目标源表标识(记为tableName)是指用于识别待处理数据来源表的标识,例如,如上述SQL语句2所示,“'t2'as tableName from t2”中't2'即为目标源表标识,表示待处理数据来源于't2'表。
其中,目标全字段是指待处理数据的目标源表标识、目标记录标识、目标分区标识和数据内容等字段信息。
待处理数据的有效字段是指带有实际数据内容的字段,比如,上述SQL语句2中,t1的有效字段是(age)这一列,t2的有效字段是(sex)这一列。进一步地,有效字段还可以进一步包括记录标识等,具体可以根据实际数据处理业务需求而设置有效字段所包含的具体内容,比如,上述SQL语句2中,t1的有效字段是(id,age)两列,t2的有效字段是(id,sex)两列。有效字段的具体内容可以根据实际数据处理业务需求而设置,此处有效字段仅为举例,不以此为限。
目标有效字段是指待处理数据对应的有效字段。
2012、根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,确定所述目标有效字段。
其中,第一映射关系用于指示源表与有效字段之间的映射关系,具体用于指示目标源表标识与目标有效字段之间的映射关系。
本申请实施例中涉及到左表流数据和右表流数据两种流数据类型,不同的流数据类型的目标有效字段获取方式不同,下面分别针对两种情况进行说明。此时,步骤2012之前还包括:基于所述待处理数据中携带的目标分区标识,以及预设的分区标识与流数据类型之间的第二映射关系,确定所述待处理数据的流数据类型。
其中,目标分区标识是指待处理数据待写入的分区的标识。比如,上述SQL语句2中待处理数据为“t0.id,t0.name,null as age,null as sex,t0.partition,'t0'astableName from t0”,“partition”表示待处理数据t0表的目标分区标识。
第二映射关系用于指示分区标识与流数据类型之间的映射关系,具体用于指示目标分区标识与待处理数据的流数据类型之间的映射关系。
如上步骤2011所示,目标全字段中包含了待处理数据的目标分区标识。首先,对待处理数据进行解析后将得到待处理数据的目标全字段,从而可以得到待处理数据中携带的目标分区标识。然后,根据目标分区标识以及第二映射关系,即可确定待处理数据的流数据类型。例如,第二映射关系如下表1所示,若对待识别语句进行解析,得到待处理数据的目标全字段为“t0.id,t0.name,null as age,null as sex,t0.partition,'t0'as tableNamefrom t0”,则可以确定待处理数据的目标分区标识为't0.partition',与”t0.partition'存在映射关系的流数据类型为:左表流数据,因此,可以确定待处理数据的流数据类型为:左表流数据。若对待识别语句进行解析,得到待处理数据的目标全字段为“t1.id null asname,t1.age,null as sex,'_empty_'as partition,'t1'as tableName from t1”,则可以确定待处理数据的目标分区标识为'empty',与”empty'存在映射关系的流数据类型为:右表流数据,因此,可以确定待处理数据的流数据类型为:右表流数据。
表1
分区标识 | 流数据类型 |
empty | 右表流数据 |
非“empty” | 左表流数据 |
请参照图3,下面正式对流数据类型为左表流数据和右表流数据两种情况,对目标有效字段获取方式进行说明。
一、流数据类型为右表流数据。
其中,所述算子状态中用于记录右表流数据。目标有效字段具体是指待处理数据的有效字段与算子状态中记录的右表流数据进行合并后得到的有效字段。此时,步骤2012具体可以包括如下步骤a1~a3,其中:
a1、根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,得到所述待处理数据的初步有效字段。
初步有效字段是指目标全字段中所包含的实际数据内容的字段。比如,上述SQL语句2中,t1的初步有效字段是(age)这一列,t2的初步有效字段是(sex)这一列。进一步地,初步有效字段还可以进一步包括记录标识等,比如,上述SQL语句2中,t1的初步有效字段是(id,age)两列,t2的初步有效字段是(id,sex)两列。
例如,第一映射关系如下表2所示,对待识别语句进行解析,得到待处理数据的目标全字段为“t0.id,t0.name,null as age,null as sex,t0.partition,'t0'astableName from t0”,则可以确定待处理数据的目标源表标识为't0',与't0'存在映射关系的有效字段为:id,name,partition,因此,可以将“id,name,partition”作为初步有效字段。
表2
源表 | 有效字段 |
t0 | id,name,partition |
t1 | id,age |
t2 | id,sex |
a2、当所述待处理数据的流数据类型为右表流数据时,根据所述初步有效字段,更新所述算子状态中与所述目标记录标识关联记录的右表流数据,得到更新后右表流数据。
在一些实施例中,算子状态中记录的右表流数据为右表流数据的有效字段。此时,步骤a2中,首先,从算子状态中查询到与目标记录标识关联记录的目标右表流数据。当查询到与目标记录标识关联记录的目标右表流数据时,采用初步有效字段更新算子状态中的目标右表流数据的有效字段,得到更新后右表流数据。
其中,“采用初步有效字段更新算子状态中的目标右表流数据的有效字段”时,更新包括两种情况:合并和替换。例如,当算子状态中已记录的目标右表流数据为t1表(id=1,age=20,partition='_empty_')的有效字段为(id,age),待处理数据为t2表(id=1,sex=man,partition='_empty_')的初步有效字段为(id,sex),此时可以通过将目标右表流数据为t1表(id=1,age=20,partition='_empty_')的有效字段为(id,age)与t2表(id=1,sex=man,partition='_empty_')的初步有效字段为(id,sex)进行合并方式,实现采用初步有效字段更新算子状态中的目标右表流数据的有效字段,得到更新后右表流数据(id,age,sex)。
当未查询到与目标记录标识关联记录的目标右表流数据时,将初步有效字段直接新增记录至算子状态中,以更新算子状态中记录的右表流数据,此时更新后右表流数据具体为初步有效字段。
a3、将更新后的所述右表流数据作为所述目标有效字段。
本申请实施例中的一个重要改进点在于,在Flink的state中新增了一个存储右表流数据的属性,用来存储所有的右表流数据。通过如上步骤2011和2012、步骤a1~a3可知,当待处理数据的流数据类型为右表流数据时,通过根据初步有效字段,更新算子状态中与目标记录标识关联记录的右表流数据,得到更新后右表流数据;从而可以有效地在Flink的state存储所有的右表流数据,从而保证后续的宽表数据更新。并且,在保证宽表数据可以有效更新基础,只需将右表流数据存储在Flink的state,而无需将全量的左表流数据和右表流数据存储在Flink的state中,可以有效地降低state的存储压力。
二、流数据类型为左表流数据。
此时,目标有效字段具体是指初步有效字段。步骤2012中可以直接将目标全字段中的有效字段内容作为目标有效字段。步骤2012具体可以包括如下步骤b1~b2:
b1、根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,得到所述待处理数据的初步有效字段。
步骤b1的实现与上述步骤a1的实现类似,具体可以参照上述a1的相关说明,此处不再赘述。
b2、当所述待处理数据的流数据类型为左表流数据时,将初步有效字段作为所述目标有效字段。
202、基于所述待处理数据的流数据类型,更新所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识,得到与所述目标记录标识关联记录的更新后文件标识。
目标文件标识是指待处理数据待写入的文件的标识。
算子状态是指Flink的state,Flink的state用来存放计算过程的节点中间结果或元数据等。
不同情况下,例如,与目标记录标识关联的目标文件标识是否为空值、待处理数据是否为待删除状态、Flink的算子状态中与目标记录标识关联的目标文件标识与目标分区标识是否相同,步骤202更新目标文件标识的方式不同,下面分别举例进行说明。
一)、与目标记录标识关联的目标文件标识是否为空值。
①Flink的state中与目标记录标识关联的目标文件标识为空值。
在某些情况下,Flink的算子状态中与目标记录标识关联的目标文件标识为空值;例如,当Flink未消费过与目标记录标识对应的流数据时,Flink的算子状态中将不会记录到与目标记录标识关联的目标文件标识,因此,Flink的算子状态中与目标记录标识关联的目标文件标识为空值。此时,可以直接将目标分区标识作为更新后文件标识。
继续参照图3,此时,步骤202具体可以包括步骤2021A~2023A:
2021A、检测所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识是否为空值。
2022A、当所述目标文件标识为空值时,将所述目标分区标识与所述目标记录标识关联记录至所述算子状态中。
2023A、将所述目标分区标识作为所述更新后文件标识。
其中,目标文件标识(记为“Location”)是指用于记录待处理数据待写入的分区目录和文件的标识。示例性地,目标文件标识包括分区目标和文件标识(记为“filedId”)。分区目录用于指示待处理数据待写入的分区,文件标识用于指示待处理数据待写入的文件。一旦待处理数据被确定写入的目标文件标识时,就会进入步骤203将待处理数据按照fileId分组下发至Hudi层中与更新后文件标识对应的目标子任务(记为subTask),再按文件标识进行批量写入。
例如,算子状态中记录的文件标识和记录标识如下表3所示,通过检测如下表3所示的算子状态中各文件标识发现,算子状态中不存在与目标记录标识(如“3”)关联记录的目标文件标识,则确定Flink的算子状态中与目标记录标识关联记录的目标文件标识为空值。算子状态中存在与目标记录标识(如“6”)关联记录的目标文件标识“Location6”,则可以确定Flink的算子状态中与目标记录标识关联记录的目标文件标识为非空值。
表3
记录标识(id) | 文件标识(Location) |
1 | Location1 |
2 | Location2 |
6 | Location6 |
为了方便理解,接以上步骤2021A的例子继续说明。例如,目标记录标识“3”的待处理数据的目标分区标识为“Location3”,当目标文件标识为空值时,可以将目标记录标识“3”与目标分区标识“Location3”关联记录至Flink的算子状态中,并将目标分区标识“Location3”作为更新后文件标识。以便于步骤203将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务,对在更新后文件标识对应文件中的目标记录标识关联的数据进行更新,实现局部数据更新。
可见,本申请实施例中,当目标文件标识为空值时,通过将目标分区标识与目标记录标识关联记录至算子状态中、并将目标分区标识作为更新后文件标识(记为新Location)下发至目标子任务进行目标宽表文件的更新,可以有效地保证宽表数据中的可以有效更新,从而保证可以有效针对宽表中的局部字段数据进行更新。
②Flink的state中与目标记录标识关联的目标文件标识为非空值。
在某些情况下,Flink的算子状态中与目标记录标识关联的目标文件标识为空值;例如,当Flink消费过与目标记录标识对应的流数据时,Flink的算子状态中将会记录到与目标记录标识关联的目标文件标识,因此,Flink的算子状态中与目标记录标识关联的目标文件标识为非空值。此时,可以直接将目标文件标识更新为目标分区标识,得到更新后文件标识。
继续参照图3,此时,步骤202具体可以包括步骤2021B~2023B:
2021B、检测所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识是否为空值。
2022B、当所述目标文件标识为非空值时,将所述算子状态中与所述目标记录标识关联记录的目标文件标识更新为所述目标分区标识,得到更新后文件标识。
其中,步骤2021B~2023B与上述步骤2021A~2023A类似,具体可以参照上述说明,为简化表述,此处不再赘述。
为了方便理解,接以上步骤2021A的例子继续说明。例如,目标记录标识“6”的待处理数据的目标分区标识为“Location6-1”,当目标文件标识为非空值时,可以将与目标记录标识“6”关联记录的目标文件标识“Location6”更新为目标分区标识“Location6-1”,得到更新后文件标识“Location6-1”。以便于步骤203将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务,对在更新后文件标识对应文件中的目标记录标识关联的数据进行更新,实现局部数据更新。
二)、待处理数据是否为待删除状态。
继续参照图3,此时,步骤202具体可以包括步骤2021C~2023C:
2021C、检测所述待处理数据是否为待删除状态。
其中,待处理数据可以被执行包括删除(记为delete)、合并(记为insert)、更新(记为update)等操作。通过对待处理数据进行解析可以确定需对待处理数据执行何种操作。例如,如上述SQL语句2所示,通过解析待处理数据可以确定待处理数据需要执行合并(insert)操作。
示例性地,通过解析待处理数据,可以确定待处理数据的执行操作类型,从而确定待处理数据是否处于待删除状态。当待处理数据的执行操作类型为删除(delete)操作时,确定待处理数据为待删除状态。当待处理数据的执行操作类型为非删除(delete)操作,如合并(insert)操作、更新(update)操作时,确定待处理数据不是待删除状态。
2022C、若所述待处理数据为待删除状态,则将所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识设置为空值。
2023C、将为空值的所述目标文件标识作为所述更新后文件标识。
例如,如表3所示,通过解析待处理数据可以确定目标记录标识为“6”的待处理数据需要执行删除(delete)操作,则可以将Flink的算子状态中与目标记录标识关联记录的目标文件标识设置为空值,并将为空值的目标文件标识作为更新后文件标识,如下表4所示。以便于步骤203将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务,对在更新后文件标识对应文件中的目标记录标识关联的数据进行删除,实现局部数据更新。
表4
记录标识(id) | 文件标识(Location) |
1 | Location1 |
2 | Location2 |
6 | - |
2024C、若所述待处理数据不是待删除状态,则按照正常流程,如按照步骤2021A~2023A、步骤2021B~2023B、或者步骤2021D~2023D中的方式进行更新所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识,得到与所述目标记录标识关联记录的更新后文件标识。
可见,本申请实施例中,通过将为空值的目标文件标识作为更新后文件标识下发至目标子任务进行目标宽表文件的更新,可以有效地保证宽表数据中的可以有效删除,从而保证可以有效针对宽表中的局部字段数据进行更新。
三)、Flink的算子状态中与目标记录标识关联的目标文件标识与目标分区标识是否相同。
在某些情况下,Flink的算子状态中与目标记录标识关联的目标文件标识与目标分区标识不相同,此时需要对Flink的算子状态中与目标记录标识关联的目标文件标识进行变更,以保证后续可以正常对在更新后文件标识对应文件中的目标记录标识关联的数据进行更新,实现局部数据更新。例如,当Flink先消费的是左表流数据t1(id=1,age=20,partition='empty'),那么Flink的算子状态先记录的目标文件标识是'empty';当再来一条右表流数据t0(id=1,name=zs,partition=2021)时,分区从empty变成了2021,那么就属于需要变更分区的场景,即需要对Flink的算子状态中与目标记录标识关联的目标文件标识进行变更。
此时,步骤202具体可以包括步骤2021D~2023D:
2021D、检测所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识与所述目标分区标识是否相同。
示例性地,步骤2021D中,首先,从Flink的算子状态中查找到与目标记录标识关联记录的目标文件标识;然后,对比目标文件标识与目标分区标识是否相同。如,Flink的算子状态记录的文件标识如表3所示,若目标记录标识为“1”、目标分区标识为“Location1”,则可以确定目标文件标识与目标分区标识相同。若目标记录标识为“6”、目标分区标识为“Location5”,则可以确定目标文件标识“Location6”与目标分区标识“Location5”不相同。
2022D、若所述目标文件标识与所述目标分区标识不同,则将所述目标文件标识更新为所述目标分区标识。
2023D、将所述目标分区标识作为所述更新后文件标识。
以便于步骤203将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务,对在更新后文件标识对应文件中的目标记录标识关联的数据进行更新,实现局部数据更新。步骤2022D~2023D与上述步骤2022B~2023B类似,可以参照上述相关说明,为简化表述,此处不再赘述。
若所述目标文件标识与所述目标分区标识相同,则可以不对目标分区标识进行实际变更,而直接采用Flink的算子状态中原始记录的、与目标记录标识关联记录的目标文件标识作为更新后文件标识。以便于步骤203将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务,对在更新后文件标识对应文件中的目标记录标识关联的数据进行更新,实现局部数据更新。
203、将所述目标有效字段下发至Hudi层中与所述更新后文件标识对应的目标子任务。
本申请实施例中,通过将Flink实现的Join操作下沉至Hudi层(简称Hudi onFlink),通过Hudi on Flink场景下实现宽表数据的写入。示例性地,例如,如图4所示,在Hudi on Flink场景如果以COW的方式写入,将会由RowDataToHoodieFunction、BucketAssignFunction和StreamWriteFunction三个算子产生一个pipeline进行数据写入。
其中,RowDataToHoodieFunction是对收入的数据进行转化成一个HudiRecord,具体是把流入的每条数据进行了一次字段裁剪只保留了有效的字段流入下游算子BucketAssignFunction,其具体实现逻辑可以参照上述步骤201。
BucketAssignFunction是用来对记录分配Location,Loaction包含两部分信息:一个是分区目录、另一个是fileId,fileId用来标识记录将写入哪个文件,一旦记录被确定写入哪个文件时就会将记录按照fileId分组发送到StreamWriteFunction,其具体实现逻辑可以参照上述步骤202。步骤203中正是实现将记录按照fileId分组发送到StreamWriteFunction。
StreamWriteFunction的作用是按文件进行批量写入,其具体实现逻辑可以参照下述步骤204。
其中,目标子任务是指StreamWriteFunction中用于将目标记录标识对应的流数据写入更新后文件标识对应的文件中的subTask。
其中,当Hudi层中已有与更新后文件标识对应的子任务时,将Hudi层中已有与更新后文件标识对应的子任务作为目标子任务,直接分配目标有效字段给该目标子任务处理。当Hudi层中没有与更新后文件标识对应的子任务时,可新建与更新后文件标识对应的子任务作为目标子任务,并分配目标有效字段给该新建的目标子任务处理。
由于目标子任务需要依据目标记录标识进行更新处理,为了保证目标子任务可以有效依据目标记录标识进行数据更新,当步骤201中获取的目标有效字段包含目标记录标识(实际场景中,一般包括目标记录标识)时,步骤203中,可以只将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务。当步骤201中获取的目标有效字段不包含目标记录标识时,步骤203中,将目标有效字段和目标记录标识一起下发至Hudi层中与更新后文件标识对应的目标子任务。
204、当符合预设的更新条件时,通过所述目标子任务,根据所述更新后文件标识关联的目标宽表文件中的历史宽表数据以及所述目标有效字段,更新所述目标宽表文件得到更新后的目标宽表文件。
subTask是一个批处理操作,其先把数据在内存进行缓存,当数据攒到一定阈值时会进行flush,当触发checkpoint时会强制对所有缓存的数据进行flush。在执行flush写入文件时我们使用的COW模式会把老的数据先读出来,然后再基于老数据的基础上进行局部更新。
其中,预设的更新条件是指触发subTask进行批处理操作的条件,例如,当缓存在subTask内存的数据攒到一定阈值时。
本申请实施例中,宽表是指左表和右表进行合并后得到的宽表。比如,将表5、6、7进行合并后,可以得到如表8所示的宽表。
表5
id | name |
1 | zs |
2 | ls |
表6
id | age |
1 | 20 |
2 | 30 |
表7
id | sex |
1 | m |
2 | f |
表8
历史宽表数据是指更新后文件标识对应的文件中所记录的宽表数据。例如,更新后文件标识对应的文件中所记录的宽表数据如表8所示。
步骤204中,更新目标宽表文件的情况包括多种,例如,待处理数据与目标文件标识对应文件中的宽表数据进行合并、待处理数据替换目标文件标识对应文件中的宽表数据。其中,目标宽表文件已经存在目标记录标识对应的目标历史宽表数据时、与不存在目标记录标识对应的目标历史宽表数据时,目标宽表文件的更新方式不同。下面分别举例进行说明:
(一)目标宽表文件已经存在目标记录标识对应的目标历史宽表数据。
其中,目标有效字段包括目标记录标识和待处理数据的目标数据内容。此时,步骤204具体可以包括如下步骤2041A~2043A:
2041A、通过所述目标子任务,检测所述历史宽表数据中是否包含与所述目标记录标识对应的目标历史宽表数据。
其中,目标历史宽表数据是指更新后文件标识对应的文件记录的各历史宽表数据中,与目标记录标识对应的历史宽表数据。
示例性地,目标子任务为StreamWriteFunction中用于将目标记录标识对应的流数据写入更新后文件标识对应的文件中的subTask。subTask是一个批处理操作,其先把数据在内存进行缓存,当数据攒到一定阈值时会进行flush,当触发checkpoint时会强制对所有缓存的数据进行flush。在执行flush写入文件时我们使用的COW模式会把老的数据先读出来,然后再基于老数据的基础上进行局部更新。此时,可以通过目标子任务,检测历史宽表数据中是否包含与目标记录标识对应的目标历史宽表数据。
例如,历史宽表数据如表8所示,若目标记录标识为“1”,则确定历史宽表数据中包含与目标记录标识对应的目标历史宽表数据。若目标记录标识为“3”,则确定历史宽表数据中不包含与目标记录标识对应的目标历史宽表数据。
2042A、当所述历史宽表数据中包含所述目标历史宽表数据时,采用所述目标数据内容更新所述目标历史宽表数据,得到所述目标记录标识关联的第一目标宽表数据。
第一目标宽表数据是指采用目标数据内容对目标历史宽表数据进行更新后,所得到的宽表数据。
2043A、将所述第一目标宽表数据写回所述目标宽表文件,得到更新后的目标宽表文件。
步骤2042A~2043A中,更新目标历史宽表数据包括替换情况和合并情况,下面分别举例说明:
(1)合并情况。将目标数据内容与目标历史宽表数据中的对应字段进行合并。
例如,老数据record(即目标历史宽表数据)是{id:1,name:null,age:null,sex:man},新收到了(即目标有效字段){id:1,name:ls}、{id:1,age:30}这2条数据,就先会从更新后文件标识对应的文件中,把老数据读出来然后依次和新收到的数据进行合并,得到第一目标宽表数据{id:1,name:ls,age:30,sex:man},然后再写回文件中。
(2)替换情况。此时,将采用目标数据内容替换目标历史宽表数据中的对应字段内容。
例如,如图5所示,老数据record(即目标历史宽表数据)是{id:1,name:zs,age:20,sex:man},新收到了(即目标有效字段){id:1,name:ls}、{id:1,age:30}这2条数据,就先会从更新后文件标识对应的文件中,把老数据读出来然后;然后,采用新收到的数据依次替换老数据,得到第一目标宽表数据{id:1,name:ls,age:30,sex:man},再写回文件中。
其中,合并、替换过程只会选择有效字段的合并、替换,即只将有效数据内容进行合并、替换。
可见,本申请实施例中,通过采用目标数据内容更新目标历史宽表数据,可以有效地保证左表流数据和右表流数据可以有效合并、替换,从而保证可以有效针对宽表中的局部字段数据进行更新,避免无法有效地对宽表数据写入的问题。
(二)目标宽表文件不存在目标记录标识对应的目标历史宽表数据。
其中,目标有效字段包括目标记录标识和待处理数据的目标数据内容。此时,步骤204具体可以包括如下步骤2041B~2043B:
2041B、通过所述目标子任务,检测所述历史宽表数据中是否包含与所述目标记录标识对应的目标历史宽表数据。
步骤2041B与上述步骤2041A实现类似,具体可以参照上述说明。
2042B、当所述历史宽表数据中不包含所述目标历史宽表数据时,生成与所述目标记录标识关联的模板宽表数据。
其中,模板宽表数据是指参数值为默认值的、与目标记录标识对应的宽表数据。
2043B、将所述目标数据内容和所述模板宽表数据进行合并,得到所述目标记录标识关联的第二目标宽表数据。
第二目标宽表数据是指采用目标数据内容与目标历史宽表数据进行合并后,所得到的宽表数据。
2044B、将所述第二目标宽表数据写回所述目标宽表文件,得到更新后的目标宽表文件。
例如,如图6所示,假如收到了如下3条数据:{id:1,name:zs}、{id:1,age:20}、{id:1,sex:man},在执行flush时会创建一个全字段的空记录{id:null,name:null,age:null,sex:null},然后依次和3条记录进行合并,比如:
{id:1,name:zs}与{id:null,name:null,age:null,sex:null}合并成{id:1,name:zs,age:null,sex:null};
{id:1,name:zs,age:null,sex:null}与{id:1,age:20}合并成{id:1,name:zs,age:20,sex:null};
{id:1,name:zs,age:20,sex:null}与{id:1,sex:man}合并成{id:1,name:zs,age:20,sex:man};
最终得到第二目标宽表数据{id:1,name:zs,age:20,sex:man},并写回文件中。其中,合并过程只会选择有效字段的合并,即只将有效数据内容进行合并。
可见,本申请实施例中,当历史宽表数据中不包含目标历史宽表数据时,通过生成与目标记录标识关联的模板宽表数据,可以有效地保证左表流数据和右表流数据可以有效合并,并正确地写入文件中。
由以上内容可以看出,本申请实施例中,当Flink读取到源端的待处理数据时,基于待处理数据中携带的目标源表标识获取待处理数据的目标有效字段;更新Flink的算子状态中与目标记录标识关联记录的目标文件标识,得到与目标记录标识关联记录的更新后文件标识;将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务;当符合预设的更新条件时,通过目标子任务,根据更新后文件标识关联的目标宽表文件中的历史宽表数据以及目标有效字段,更新目标宽表文件得到更新后的目标宽表文件。第一方面,由于是通过提取目标有效字段对目标历史宽表数据进行更新,因此可以只选择有效字段的更新,从而达到局部更新的效果,避免了Hudi的COW写入模式下会用最新的字段数据全面覆盖老的字段数据而导致无法有效针对局部字段数据进行更新的问题,实现有效地对宽表数据写入。第二方面,通过将目标有效字段下发至Hudi层中与更新后文件标识对应的目标子任务,实现将宽表更新下发至Hudi层去实现,使得Flink中的算子状态无需存储全量的左表流数据和右表流数据,从而降低Flink中的算子状态的数据存储量,可以有效降低地state的存储压力。
为了更好实施本申请实施例中多表数据的更新方法,在多表数据的更新方法基础之上,本申请实施例中还提供一种多表数据的更新装置,如图7所示,为本申请实施例中多表数据的更新装置的一个实施例结构示意图,该多表数据的更新装置700包括:
获取单元701,用于当Flink读取到源端的待处理数据时,基于所述待处理数据中携带的目标源表标识获取所述待处理数据的目标有效字段,其中,所述待处理数据中还携带有目标记录标识;
标识更新单元702,用于更新所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识,得到与所述目标记录标识关联记录的更新后文件标识;
下发单元703,用于将所述目标有效字段下发至Hudi层中与所述更新后文件标识对应的目标子任务;
数据更新单元704,用于当符合预设的更新条件时,通过所述目标子任务,根据所述更新后文件标识关联的目标宽表文件中的历史宽表数据以及所述目标有效字段,更新所述目标宽表文件得到更新后的目标宽表文件。
在本申请一种可能的实现方式中,所述获取单元701具体用于:
对所述待处理数据进行解析,得到所述待处理数据的目标全字段,其中,所述目标全字段包含所述待处理数据的目标源表标识;
根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,确定所述目标有效字段。
在本申请一种可能的实现方式中,所述算子状态中用于记录右表流数据,所述获取单元701具体用于:
根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,得到所述待处理数据的初步有效字段;
当所述待处理数据的流数据类型为右表流数据时,根据所述初步有效字段,更新所述算子状态中与所述目标记录标识关联记录的右表流数据,得到更新后右表流数据;
将所述更新后右表流数据作为所述目标有效字段。
在本申请一种可能的实现方式中,所述标识更新单元702具体用于:
检测所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识是否为空值;
当所述目标文件标识为空值时,将所述目标分区标识与所述目标记录标识关联记录至所述算子状态中;
将所述目标分区标识作为所述更新后文件标识。
在本申请一种可能的实现方式中,所述根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,确定所述目标有效字段之前,所述获取单元701具体用于:
基于所述待处理数据中携带的目标分区标识,以及预设的分区标识与流数据类型之间的第二映射关系,确定所述待处理数据的流数据类型。
在本申请一种可能的实现方式中,所述待处理数据中还携带有目标分区标识,所述标识更新单元702具体用于:
检测所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识与所述目标分区标识是否相同;
若所述目标文件标识与所述目标分区标识不同,则将所述目标文件标识更新为所述目标分区标识;
将所述目标分区标识作为所述更新后文件标识。
在本申请一种可能的实现方式中,所述待处理数据中还携带有目标分区标识,所述标识更新单元702具体用于:
检测所述待处理数据是否为待删除状态;
若所述待处理数据为待删除状态,则将所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识设置为空值;
将为空值的所述目标文件标识作为所述更新后文件标识。
在本申请一种可能的实现方式中,所述目标有效字段包括所述目标记录标识和所述待处理数据的目标数据内容,所述数据更新单元704具体用于:
通过所述目标子任务,检测所述历史宽表数据中是否包含与所述目标记录标识对应的目标历史宽表数据;
当所述历史宽表数据中包含所述目标历史宽表数据时,采用所述目标数据内容更新所述目标历史宽表数据,得到所述目标记录标识关联的第一目标宽表数据;
将所述第一目标宽表数据写回所述目标宽表文件,得到更新后的目标宽表文件。
在本申请一种可能的实现方式中,所述通过所述目标子任务,检测所述历史宽表数据中是否包含与所述目标记录标识对应的目标历史宽表数据的步骤之后,所述数据更新单元704具体用于:
当所述历史宽表数据中不包含所述目标历史宽表数据时,生成与所述目标记录标识关联的模板宽表数据;
将所述目标数据内容和所述模板宽表数据进行合并,得到所述目标记录标识关联的第二目标宽表数据;
将所述第二目标宽表数据写回所述目标宽表文件,得到更新后的目标宽表文件。
具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元的具体实施可参见前面的方法实施例,在此不再赘述。
由于该多表数据的更新装置可以执行本申请如图1至图6对应任意实施例中多表数据的更新方法中的步骤,因此,可以实现本申请如图1至图6对应任意实施例中多表数据的更新方法所能实现的有益效果,详见前面的说明,在此不再赘述。
此外,为了更好实施本申请实施例中多表数据的更新方法,在多表数据的更新方法基础之上,本申请实施例还提供一种电子设备,参阅图8,图8示出了本申请实施例电子设备的一种结构示意图,具体的,本申请实施例提供的电子设备包括处理器801,处理器801用于执行存储器802中存储的计算机程序时实现如图1至图6对应任意实施例中多表数据的更新方法的各步骤;或者,处理器801用于执行存储器802中存储的计算机程序时实现如图7对应实施例中各单元的功能。
示例性的,计算机程序可以被分割成一个或多个模块/单元,一个或者多个模块/单元被存储在存储器802中,并由处理器801执行,以完成本申请实施例。一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述计算机程序在计算机装置中的执行过程。
电子设备可包括,但不仅限于处理器801、存储器802。本领域技术人员可以理解,示意仅仅是电子设备的示例,并不构成对电子设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如电子备还可以包括输入输出设备、网络接入设备、总线等,处理器801、存储器802、输入输出设备以及网络接入设备等通过总线相连。
处理器801可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,处理器是电子设备的控制中心,利用各种接口和线路连接整个电子设备的各个部分。
存储器802可用于存储计算机程序和/或模块,处理器801通过运行或执行存储在存储器802内的计算机程序和/或模块,以及调用存储在存储器802内的数据,实现计算机装置的各种功能。存储器802可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据电子设备的使用所创建的数据(比如音频数据、视频数据等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的多表数据的更新装置、电子设备及其相应单元的具体工作过程,可以参考如图1至图6对应任意实施例中多表数据的更新方法的说明,具体在此不再赘述。
本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一计算机可读存储介质中,并由处理器进行加载和执行。
为此,本申请实施例提供一种计算机可读存储介质,其中存储有多条指令,该指令能够被处理器进行加载,以执行本申请如图1至图6对应任意实施例中多表数据的更新方法中的步骤,具体操作可参考如图1至图6对应任意实施例中多表数据的更新方法的说明,在此不再赘述。
其中,该计算机可读存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁盘或光盘等。
由于该计算机可读存储介质中所存储的指令,可以执行本申请如图1至图6对应任意实施例中多表数据的更新方法中的步骤,因此,可以实现本申请如图1至图6对应任意实施例中多表数据的更新方法所能实现的有益效果,详见前面的说明,在此不再赘述。
以上对本申请实施例所提供的一种多表数据的更新方法、装置、电子设备及计算机可读存储介质进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (12)
1.一种多表数据的更新方法,其特征在于,所述方法包括:
当Flink读取到源端的待处理数据时,基于所述待处理数据中携带的目标源表标识获取所述待处理数据的目标有效字段,其中,所述待处理数据中还携带有目标记录标识;
更新所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识,得到与所述目标记录标识关联记录的更新后文件标识;
将所述目标有效字段下发至Hudi层中与所述更新后文件标识对应的目标子任务;
当符合预设的更新条件时,通过所述目标子任务,根据所述更新后文件标识关联的目标宽表文件中的历史宽表数据以及所述目标有效字段,更新所述目标宽表文件得到更新后的目标宽表文件。
2.根据权利要求1所述的多表数据的更新方法,其特征在于,所述基于所述待处理数据中携带的目标源表标识获取所述待处理数据的目标有效字段,包括:
对所述待处理数据进行解析,得到所述待处理数据的目标全字段,其中,所述目标全字段包含所述待处理数据的目标源表标识;
根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,确定所述目标有效字段。
3.根据权利要求2所述的多表数据的更新方法,其特征在于,所述算子状态中用于记录右表流数据,所述根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,确定所述目标有效字段,包括:
根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,得到所述待处理数据的初步有效字段;
当所述待处理数据的流数据类型为右表流数据时,根据所述初步有效字段,更新所述算子状态中与所述目标记录标识关联记录的右表流数据,得到更新后右表流数据;
将所述更新后右表流数据作为所述目标有效字段。
4.根据权利要求2所述的多表数据的更新方法,其特征在于,所述根据预设的源表与有效字段之间的第一映射关系、所述目标源表标识和所述目标全字段,确定所述目标有效字段之前,还包括:
基于所述待处理数据中携带的目标分区标识,以及预设的分区标识与流数据类型之间的第二映射关系,确定所述待处理数据的流数据类型。
5.根据权利要求1所述的多表数据的更新方法,其特征在于,所述待处理数据中还携带有目标分区标识,所述更新所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识,得到与所述目标记录标识关联记录的更新后文件标识,包括:
检测所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识是否为空值;
当所述目标文件标识为空值时,将所述目标分区标识与所述目标记录标识关联记录至所述算子状态中;
将所述目标分区标识作为所述更新后文件标识。
6.根据权利要求1所述的多表数据的更新方法,其特征在于,所述待处理数据中还携带有目标分区标识,所述更新所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识,得到与所述目标记录标识关联记录的更新后文件标识,包括:
检测所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识与所述目标分区标识是否相同;
若所述目标文件标识与所述目标分区标识不同,则将所述目标文件标识更新为所述目标分区标识;
将所述目标分区标识作为所述更新后文件标识。
7.根据权利要求1所述的多表数据的更新方法,其特征在于,所述更新所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识,得到与所述目标记录标识关联记录的更新后文件标识,包括:
检测所述待处理数据是否为待删除状态;
若所述待处理数据为待删除状态,则将所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识设置为空值;
将为空值的所述目标文件标识作为所述更新后文件标识。
8.根据权利要求1-7任一项所述的多表数据的更新方法,其特征在于,所述目标有效字段包括所述目标记录标识和所述待处理数据的目标数据内容,所述通过所述目标子任务,根据所述更新后文件标识关联的目标宽表文件中的历史宽表数据以及所述目标有效字段,更新所述目标宽表文件得到更新后的目标宽表文件,包括:
通过所述目标子任务,检测所述历史宽表数据中是否包含与所述目标记录标识对应的目标历史宽表数据;
当所述历史宽表数据中包含所述目标历史宽表数据时,采用所述目标数据内容更新所述目标历史宽表数据,得到所述目标记录标识关联的第一目标宽表数据;
将所述第一目标宽表数据写回所述目标宽表文件,得到更新后的目标宽表文件。
9.根据权利要求8所述的多表数据的更新方法,其特征在于,所述通过所述目标子任务,检测所述历史宽表数据中是否包含与所述目标记录标识对应的目标历史宽表数据之后,还包括:
当所述历史宽表数据中不包含所述目标历史宽表数据时,生成与所述目标记录标识关联的模板宽表数据;
将所述目标数据内容和所述模板宽表数据进行合并,得到所述目标记录标识关联的第二目标宽表数据;
将所述第二目标宽表数据写回所述目标宽表文件,得到更新后的目标宽表文件。
10.一种多表数据的更新装置,其特征在于,所述多表数据的更新装置包括:
获取单元,用于当Flink读取到源端的待处理数据时,基于所述待处理数据中携带的目标源表标识获取所述待处理数据的目标有效字段,其中,所述待处理数据中还携带有目标记录标识;
标识更新单元,用于更新所述Flink的算子状态中与所述目标记录标识关联记录的目标文件标识,得到与所述目标记录标识关联记录的更新后文件标识;
下发单元,用于将所述目标有效字段下发至Hudi层中与所述更新后文件标识对应的目标子任务;
数据更新单元,用于当符合预设的更新条件时,通过所述目标子任务,根据所述更新后文件标识关联的目标宽表文件中的历史宽表数据以及所述目标有效字段,更新所述目标宽表文件得到更新后的目标宽表文件。
11.一种电子设备,其特征在于,包括处理器和存储器,所述存储器中存储有计算机程序,所述处理器调用所述存储器中的计算机程序时执行如权利要求1至9任一项所述的多表数据的更新方法。
12.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,所述计算机程序被处理器进行加载,以执行权利要求1至9任一项所述的多表数据的更新方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111223531.3A CN115994148A (zh) | 2021-10-20 | 2021-10-20 | 多表数据的更新方法、装置、电子设备及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111223531.3A CN115994148A (zh) | 2021-10-20 | 2021-10-20 | 多表数据的更新方法、装置、电子设备及可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115994148A true CN115994148A (zh) | 2023-04-21 |
Family
ID=85989262
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111223531.3A Pending CN115994148A (zh) | 2021-10-20 | 2021-10-20 | 多表数据的更新方法、装置、电子设备及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115994148A (zh) |
-
2021
- 2021-10-20 CN CN202111223531.3A patent/CN115994148A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107247808B (zh) | 一种分布式NewSQL数据库系统及图片数据查询方法 | |
US9678969B2 (en) | Metadata updating method and apparatus based on columnar storage in distributed file system, and host | |
US10198363B2 (en) | Reducing data I/O using in-memory data structures | |
US8122008B2 (en) | Joining tables in multiple heterogeneous distributed databases | |
US8719237B2 (en) | Method and apparatus for deleting duplicate data | |
US11157445B2 (en) | Indexing implementing method and system in file storage | |
CN108536745B (zh) | 基于Shell的数据表提取方法、终端、设备及存储介质 | |
WO2019105420A1 (zh) | 数据查询 | |
WO2017161540A1 (zh) | 数据查询的方法、数据对象的存储方法和数据系统 | |
US9514170B1 (en) | Priority queue using two differently-indexed single-index tables | |
US20190129740A1 (en) | Base state for thin-provisioned volumes | |
WO2016074370A1 (zh) | 一种KeyValue数据库的数据表的更新方法与表数据更新装置 | |
CN107391544B (zh) | 列式存储数据的处理方法、装置、设备及计算机储存介质 | |
US10664459B2 (en) | Database managing method, database managing system, and database tree structure | |
CN110633378A (zh) | 一种支持超大规模关系网络的图数据库构建方法 | |
CN113111038B (zh) | 文件存储方法、装置、服务器及存储介质 | |
US20170083537A1 (en) | Mapping logical identifiers using multiple identifier spaces | |
US20220342888A1 (en) | Object tagging | |
CN112965939A (zh) | 一种文件合并方法、装置和设备 | |
CN111752941B (zh) | 一种数据存储、访问方法、装置、服务器及存储介质 | |
CN109710698B (zh) | 一种数据汇聚方法、装置、电子设备及介质 | |
CN117093579A (zh) | 数据查询、数据存储方法、装置、设备及存储介质 | |
US8909875B1 (en) | Methods and apparatus for storing a new version of an object on a content addressable storage system | |
CN111753141A (zh) | 一种数据管理方法及相关设备 | |
CN115994148A (zh) | 多表数据的更新方法、装置、电子设备及可读存储介质 |
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 |