一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种数据表处理方法、装置、计算机设备以及存储介质与流程

2022-06-29 20:26:13 来源:中国专利 TAG:


1.本技术涉及计算机技术领域,尤其涉及一种数据表处理方法、装置、计算机设备以及存储介质。


背景技术:

2.随着大数据时代到来,催生了各种业务场景下的数据处理。通常的数据处理涉及数据的抽取、转换、加载(extract-transform-load,etl),采用这样的处理流程可以将分散的原始数据表的数据根据业务需求整理到数据仓库或数据集市的目标数据表中,作为数据分析、挖掘的基础。
3.目前,针对数据的etl这种存在依赖关系的数据流,在相关作业运行时,可以采用airflow调度来完成,在此过程中,主要是通过在每个任务流中加入业务定制化脚本,将原始数据表的数据转换为目标数据表的数据,对应有定制化采集脚本、定制化转换脚本以及定制化存储脚本。显然,对于非软件开发人员来说(如数据挖掘人员),定制化脚本的使用门槛高,面对不同业务场景的数据表处理,缺乏灵活性以及扩展性,当业务场景发生变化,需要手动更改定制化脚本,影响处理效率。


技术实现要素:

4.鉴于上述问题,本技术实施例提供了一种数据表处理方法、装置、计算机设备以及存储介质,可以提高不同业务场景下生成目标数据表的灵活性和扩展性,有效提升数据表处理的效率。
5.本技术实施例一方面提供了一种数据表处理方法,包括:
6.获取多张原始数据表,并基于接收到的采集指令采集各张原始数据表中的数据集,得到多个原始数据集;
7.基于接收到的连接指令将所述多个原始数据集建立连接,并对建立连接后的各个原始数据集进行转化处理,得到目标数据集;
8.接收针对所述目标数据集中各个数据项的配置指令,并基于所述各个数据项的配置指令构建出目标配置脚本;
9.基于所述目标配置脚本对所述目标数据集进行处理,并基于接收到的存储指令将处理后的目标数据集存储至目标数据表中。
10.本技术实施例一方面提供了一种数据表处理装置,包括:
11.采集模块,用于获取多张原始数据表,并基于接收到的采集指令采集各张原始数据表中的数据集,得到多个原始数据集;
12.连接模块,用于基于接收到的连接指令将所述多个原始数据集建立连接;
13.转换模块,用于对建立连接后的各个原始数据集进行转化处理,得到目标数据集;
14.配置模块,用于接收针对所述目标数据集中各个数据项的配置指令,并基于所述各个数据项的配置指令构建出目标配置脚本;
15.处理模块,用于基于所述目标配置脚本对所述目标数据集进行处理;
16.存储模块,用于基于接收到的存储指令将处理后的目标数据集存储至目标数据表中。
17.本技术实施例一方面提供了一种计算机设备,包括:网络接口、处理器和存储器,所述网络接口、处理器与存储器相连接,所述网络接口用于提供数据通信功能,所述存储器用于存储计算机程序,所述处理器用于调用所述计算机程序,以执行本技术实施例中一方面中所描述的部分或全部步骤。
18.相应的,本技术实施例提供了一种存储介质,所述存储介质存储计算机程序,所述计算机程序包括程序指令,由一个或多个所述处理器加载并执行所述程序指令,以执行本技术实施例中一方面中所述的数据表处理方法。
19.相应的,本技术提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行一方面所述的数据表处理方法。
20.可以看出,本技术实施例中,通过采集指令采集原始数据表得到的多个原始数据集,按照连接指令连接多个原始数据集并对其执行转换处理,得到目标数据集,然后根据对目标数据集中各数据项指定的配置指令,自动构建目标配置脚本,最后将目标配置脚本用于处理目标数据集,利用存储指令将处理后的目标数据集存储到目标数据表,整个数据表处理流程将数据采集、转换、存储(即数据etl)抽象出来,对数据etl的相同逻辑进行复用,从而提高了原始数据表获取所需数据集到目标数据表的处理效率。此外,根据接收到的采集指令、连接指令、配置指令以及存储指令,可以搭配出丰富的功能指令用于指示不同的数据表处理逻辑,且易于扩展,针对业务场景也可以适应性调整,以实现在不同业务场景中灵活多变的数据表处理功能。
附图说明
21.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
22.图1是本技术实施例提供的一种数据表处理系统的架构示意图;
23.图2是本技术实施例提供的一种数据表处理的流程示意图;
24.图3是本技术实施例提供的一种原始数据集连接配置的界面示意图;
25.图4是本技术实施例提供的一种目标数据集配置转换规则的界面示意图;
26.图5是本技术实施例提供的一种spark处理器的处理逻辑的流程示意图;
27.图6是本技术实施例提供的一种scala动态执行器处理逻辑的流程示意图;
28.图7是本技术实施例提供的一种存储策略配置的界面示意图;
29.图8是本技术实施例提供的一种数据表处理的流程示意图;
30.图9是本技术实施例提供的一种增量采集和去重追加存储模式下的数据表处理流程的示意图;
31.图10是本技术实施例提供的一种增量采集和追加存储模式下的数据表处理流程的示意图;
32.图11是本技术实施例提供的一种全量采集和追加存储模式下的数据表处理流程的示意图;
33.图12是本技术实施例提供的一种全量采集和覆盖存储模式下的数据表处理流程的示意图;
34.图13是本技术实施例提供的一种数据表处理装置的结构示意图;
35.图14是本技术实施例提供的一种计算机处理设备的结构示意图。
具体实施方式
36.为了使本技术领域的人员更好地理解本技术方案,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
37.另外,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中字符“/”,在不做特别说明的情况下,一般表示前后关联对象是一种“或”的关系。
38.为了更好地理解本技术实施例的方案,下面先对本技术实施例可能涉及的相关术语和概念进行介绍。
39.airflow:一个开源分布式任务调度框架。
40.spark:一个开源大数据流式处理引擎。
41.处理器:airflow中任务流上的每个数据表处理节点。
42.原始数据表:操作数据层(operational data store,ods)编目表。
43.目标数据表:包括dwd(明细数据层)、dws(汇总数据层)、dim(公共维度层)、ads(应用数据层)的编目表。
44.etl:extract-transform-load,数据抽取、转换、加载。
45.dataframe:一种以列(列名,列类型,列值)的形式构成的分布式的数据集,按照列赋予不同的名称。
46.通常,在使用airflow处理数据流时,需要在每个任务流中加入业务定制化脚本,对原始数据表进行数据表处理任务,以生成目标数据表。在特定的业务场景中涉及数据采集、数据转换以及数据存储这三个任务流,均需要人工编写定制化脚本以完成数据的处理,然而当业务场景发生变化,数据表处理需求不同,需要重新编写定制化脚本,可以发现,这样的操作缺乏灵活性和扩展性,会影响数据表处理的效率。鉴于此,本技术提供了一种基于airflow任务调度框架开发的etl方法,通过多表连接、不同采集模式加载原始数据表的数据,然后经过spark进行字段级别转换,最后以不同存储模式写入目标数据表。该方法抽象了数据的加载、存储模式,以不同模式组合完成数据读取、存储过程,中间层采用spark进行数据转换,并通过动态执行代码的方式兼顾灵活性、扩展性,能满足各种复杂业务场景对数据表处理的需求。
47.可以发现,如本技术所公开的数据表处理方法,其中这些数据(如原始数据表的数
据、目标数据表的数据)可保存于区块链上。
48.请参阅图1,是本技术实施例提供的一种数据表处理系统的架构示意图。如图1所示,该数据表处理系统包括数据表处理设备100和终端设备101,终端设备101可以包括多个,每个终端设备101可以与上述数据表处理设备100进行网络连接,网络连接可以包括有线连接或无线连接,以便于每个终端设备可以通过该网络连接与数据表处理设备100进行数据交互,以及数据表处理设备100可以接收到来自终端设备101的业务执行指令,并根据这些业务执行指令进行相应的数据表处理任务。下面对数据表处理设备100和终端设备101的具体功能进行详细介绍。
49.数据表处理设备100主要功能是根据接收到来自终端设备100的业务执行指令,包括采集指令、连接指令、配置指令、存储指令,以执行数据表处理任务。其中,采集指令可以是服务器根据自身业务需求得到的,而不用终端设备100指定。数据表处理设备100根据接收到的采集指令,从底层数据库或者其他存储源(如本地文件)存储的原始数据表中采集原始数据集,并根据连接指令连接原始数据集,然后对连接处理后的原始数据集进行转换,得到目标数据集,再根据配置指令生成目标配置脚本,对目标数据集进行处理,最后根据存储指令指示的存储方式将处理后的目标数据集存储至目标数据表中。需要说明的是,连接指令、配置指令和存储指令作为计算机语言,均可以是根据终端设备101在相应功能客户端上指定的相应规则或策略生成的。数据表处理设备100可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、cdn、以及大数据和人工智能平台等基础云计算服务的云服务器,在此不做限制。
50.终端设备101可以安装和运行用于数据采集、转换和存储的客户端,如数据etl可视化管理平台,可以客户端提供的配置界面上对数据表的采集模式、连接关系、转换规则以及存储模式进行相应的人工配置,根据人工配置的结果生成相应的业务执行指令,并将其发送给数据表处理设备100。可选的,终端设备101还可以在其运行的数据etl可视化管理平台上监控到采集到的原始数据集是否按照指定规则被成功写入到目标数据表,也可以查看到后端数据表处理设备100的对数据表处理进程。终端设备101可以是智能手机、摄像机、台式计算机、平板电脑、mp4播放器和膝上型便携计算机中的一种或多种。
51.可以发现,上述数据表处理系统可以避免人工编写定制化脚本,而是通过终端设备101组合不同处理逻辑的业务执行指令,数据表处理设备100接收到这些业务执行指令后可以得到对应的配置脚本,基于该配置脚本进行数据表处理,当具体业务场景发生变化,只需要调整终端设备101配置的业务执行指令,即可以快速应对业务场景转变带来的数据表处理逻辑的转换,使得数据表处理更加灵活、高效。
52.进一步地,为便于理解,请参见图2,是本技术实施例提供的一种数据表方法的流程示意图,该实施例中的执行主体可以是一个计算机设备或者是多个计算机设备构成的集群,该计算机设备可以是终端设备,也可以是服务器,此处,以本实施例中的执行主体为服务器(如图1所示的数据表处理设备100)为例进行说明。其中,该数据表处理方法至少可以包括以下步骤s201-s204:
53.s201,获取多张原始数据表,并基于接收到的采集指令采集各张原始数据表中的数据集,得到多个原始数据集。
54.在一种可能的实施例中,原始数据表是来自不同操作数据层的编目表,是最原始的数据,其是结构化的数据表,即包括字段名、类型等信息,如hive表。因此,多张原始数据表可以从底层数据库(如mysql、hive、redis
……
)或者终端设备本地离线存储的数据表中获取,对于获取的途径和方式在此不做限制。服务器接收到的采集指令可以是终端设备发送过来的,也可以是服务器根据获取到的多张原始数据表的结构信息和具体业务场景结合,自动生成的采集指令,对此不做限制。该采集指令指示了获取原始数据表中数据的模式,例如获取原始数据表的全部数据或者获取原始数据表的部分数据,即包括全量采集和增量采集,对应的,接收到的采集指令针对每张原始数据表可以是全量采集指令或增量采集指令。具体的,按照采集指令对每张原始数据表的固定表结构存储的数据进行采集,得到的数据集也可以和原始数据表有相同或不同的表结构,但针对每张原始数据表的数据进行采集都可以得到对应的一个数据集,例如根据采集指令原始数据表1中的所有数据采集得到数据集1,这样可以得到各原始数据表对应的多个原始数据集。
55.以接收到的采集指令为增量采集指令作为示例,基于该增量采集指令采集各张原始数据表中的数据集,得到多个原始数据集的具体步骤可以如下:首先,获取目标数据表中的已有数据集,目标数据表的已有数据集是指当前数据表处理操作之前存储在目标数据表中的数据,其中,数据集中包括多个数据项,每个数据项都是单个字段对应的数据,并且记录有数据生成的时间节点,将其作为时间戳,或者将目标数据表中的时间字段对应的时间数据作为时间戳,为了便于比较,各数据项的时间戳按照统一标准统计,如秒、分、小时、天、周、月等,对此不做限定。然后,确定出已有数据集中的目标时间戳,该目标时间戳是指已有数据集中各个数据项的时间戳中最大的时间戳。示例的,若目标数据表的已有数据集为商品3月1日至3月23日的日订单量,则按照日期,该已有数据集的最大时间戳即为3月23日。接着,确定所述各张原始数据表中时间戳大于所述目标时间戳的至少一个原始数据项,即根据目标时间戳可以确定出各张原始数据表中时间戳大于该目标时间戳的至少一个原始数据项,和目标数据表类似,前述获取到的多张原始数据表中包括的原始数据项也有时间戳,针对任一张原始数据表,将各原始数据项中时间戳大于目标时间戳的数据项挑选出来,也就是将之前未加载到目标数据表中的数据确定出来,进一步地,基于至少一个原始数据项构建出多张原始数据表对应的多个原始数据集,即基于这些原始数据项可以构建出多个原始数据集,每个原始数据集和每张原始数据表对应。举例来说,已有数据集为商品3月1日至3月23日的日订单量,获取到的多张原始数据表的某一张原始数据表中有记录商品3月1日至4月1日的日订单量,而已有数据集的最大时间戳为3月23日,此时3月24日至4月1日的商品日订单量作为大于已有数据集的最大时间戳的原始数据项,可以构建出该原始数据表对应的原始数据集,作为一种可选的示例,可以将3月24日至4月1日的商品日订单量直接作为原始数据集,也可以基于3月24日至4月1日的商品日订单量,将商品标识以及商品的其他描述数据(如日浏览量、日成交量等)拉取出来,作为原始数据集。需要说明的是,针对每个原始数据表可以得到一个原始数据集,且上述增量采集指令获取原始数据集的方式,适用获取到的多张原始数据表中的任一张原始数据表,以得到原始数据集。
56.s202,基于接收到的连接指令将多个原始数据集建立连接,并对建立连接后的各个原始数据集进行转化处理,得到目标数据集。
57.在一种可能的实施例中,由于多张原始数据表来自不同的数据库,而不同数据库
存储数据表的格式不尽相同,会导致多张原始数据表的表结构和具体数据类型等存在差别,进而造成多个原始数据集的不统一,因此需要对这些原始数据集进行转化处理和集中管理。从原始数据表中采集得到的原始数据集作为数据转换的数据源,需要预先将多个原始数据集之间通过表连接进行关联,具体的,可以基于接收到的连接指令对多个原始数据集建立连接,其中,接收到的连接指令是由终端设备对多个原始数据集配置的表连接关系生成的,包括内连接(inner join)、全连接(full join)和笛卡尔乘积连接(cross join)、左连接(left join)和右连接(right join)中任一种或多种对应的连接指令。请参见图3,是本技术实施例提供的一种原始数据集连接配置的界面示意图,如图3所示,输入编目表(即原始数据表)中包括数据操作层的健康码大屏中的健康码全量数据表和校园圈的班级打卡活动测试数据表,在配置表连接界面中将这两张原始数据表采集到的原始数据集进行内连接配置,具体是以拖拽方式,将两个原始数据集通过带有单箭头指向的连线进行连接(若不区分方向则连线可不带有箭头),并且指定其连接关系为内连接,或者连线连接后自动生成连接关系为内连接,用户也可以根据需求对自动生成的连接关系进行修改。上述通过原始数据集的内连接,可以从健康码全量数据表采集的原始数据集中筛选出班级打卡活动的健康码数据。
58.在一种可能的实施例中,在多个原始数据集的连接关系建立成功之后,为了使原始数据集管理集中,还需要对这些原始数据集进行转换处理,得到目标数据集,以便后续可以直接对目标数据集进行相应处理。对建立连接后的各原始数据集进行转换处理,得到目标数据集的实现方式具体可以如下:首先,获取建立连接后的各个原始数据集中的目标原始数据集,该目标原始数据集作为根节点与各个原始数据集建立连接,即将每个原始数据集都视为独立的节点,建立连接的原始数据集是多个具有关联关系节点的集合,从这多个具有关联关系的节点集合中可以确定出根节点,对于根节点的具体选取标准如下:入度为0,且能遍历所有节点。需要说明的是,针对内连接(inner join)、全连接(full join)和笛卡尔乘积连接(cross join)根节点选取不区分方向,而左连接和有连接则要区分方向。然后,构建出建立连接后的各个原始数据集对应的表连接树,该表连接树用于指示各个原始数据集之间的连接关系。换而言之,各个原始数据集之间的连接关系会被转换成树形表示结构,即表连接树用来指示各个原始数据集之间的连接关系。接着,基于表连接树可以生成连接关系查询表达式,并基于连接关系查询表达式对各个原始数据集进行处理,得到目标数据集。连接关系查询表达式即多表连接的结构化查询语句(structured query language,sql)表达式,根据sql表达式可以对各原始数据集进行处理,将原始数据集中的数据整合至同一个数据集中作为目标数据集。这里的目标数据集可以是spark dataframe对象df,dataframe类似于一张关系型数据表,属于spark内置类型的数据表,dataframe对象是通过sql表达式连接到其他数据库作为数据源生成的,生成dataframe对象后可以在datafame之上进行相关操作,例如展示数据、获取指定字段数据的统计信息、进行条件查询和连接操作等。相比于普通的分布式数据集,dataframe底层做了更多的优化,因此基于此目标数据集进行数据表相关处理,可以辅助提升数据表处理的速度,使得整个数据表处理过程更流畅。
59.s203,接收针对目标数据集中各个数据项的配置指令,并基于各个数据项的配置指令构建出目标配置脚本。
60.在一种可能的实施例中,目标数据表作为任务流的输出数据,需要预先定义表结构信息(如字段名、类型),并将已经定义好的表结构存储在结构化数据库中。对于目标数据表的表结构信息对应的具体数据,来源是原始数据表采集的原始数据集,但是原始数据表和目标数据表之间的字段、类型等存在差别,需要配置字段转换规则,以指示原始数据表字段向目标数据表字段转换的处理逻辑。具体实现中,可以在具备数据表处理功能的客户端(如前述运行在终端设备上的数据etl可视化管理平台)中配置字段转换规则,生成配置指令,并将该配置指令发送至服务器。请参见图4,是本技术实施例提供的一种目标数据集配置转换规则的界面示意图,如图4所示,在终端设备中提供的数据etl可视化管理平台中,可以自主选择需要配置的目标数据表,如图4输出编目表(即目标数据表)选择框中指定为明细数据层dwd的学情分析表,当目标数据表选定完成,会在该界面展示目标数据表的字段名、每个字段名的类型、是否为主键的标识以及转换输入框,通过转换输入框配置对应的转换规则可以得到原始数据表到目标数据表的处理逻辑,涉及到目标数据集中各个数据项的配置。在该目标数据集配置转换规则的界面上操作的具体步骤为:当用户光标位于转换输入框时,会出现联想下拉列表,列出当前位置能输入的所有spark函数和字段名列表,如计算累加和函数add、连接字符串函数concat、原始数据表连接后生成的新字段名等,用户选择输入后,重复前面过程直到结束表达式。需要说明的是,这里的spark函数可以是spark本身内置的函数,也可以是内置到spark中用户自定义的函数。举例来说,上述需要输出的编目表,即学情分析表中的课程标识course_id的获取,需要学校维度的原始数据表采集到的原始数据集和班级维度的原始数据表中采集到的原始数据集进行关联,转换得到目标数据集,然后使用spark函数中的聚合函数agg将相同course_id学校对各班级安排的该课程总数统计并提取出来,作为目标数据表中的course_id字段的待写入数据。
61.至此,针对目标数据集中各个数据项都对应有配置指令,指示各个数据项的处理逻辑,基于各个数据项的配置指令所指示的处理逻辑,可以对应预设的代码模块,根据配置指令调用指定的代码模块就可以生成目标配置脚本,该目标配置脚本具体可以是scala代码或其他类型的代码,如java、python等,在此不做限制。在此步骤中,通过配置指令自动构建目标配置脚本使得面向用户的操作更加简单便捷,降低了系统的使用难度。
62.s204,基于目标配置脚本对目标数据集进行处理,并基于接收到的存储指令将处理后的目标数据集存储至目标数据表中。
63.在一种可能的实施例中,目标配置脚本是目标数据集中各数据项配置指令对应的代码模块构成的代码文件,利用代码处理工具可以运行该代码文件,按照目标配置脚本的处理逻辑实现对目标数据集的处理,具体的处理内容主要是对目标数据集中各数据项进行转换,得到适合存储至目标数据表的数据。示例的,若目标数据表中的字段是用户a的年龄age,对应的数据是类似1-100这样的数值,而获取到的目标数据集中的目标字段是用户a的出生年月birth_date,对应的数据则是具有一定格式,如1997年12月的记录数据,此时需要根据目标配置脚本中对应的功能代码模块所指示的处理逻辑,将用户a的出生年月字段birth_date转换为年龄字段age,并将带有年龄字段的数据集作为处理后的目标数据集。
64.在一种可能的实施例中,基于目标配置脚本对目标数据集进行处理的具体步骤可以包括:启动计算引擎进程,并调用计算引擎对目标配置脚本进行执行,以生成处理指令,然后基于处理指令对目标数据集进行处理,得到处理结果,若处理结果满足预设条件,则关
闭计算引擎进程,以停止对目标数据集的处理。
65.具体的,计算引擎可以为spark处理器,利用任务调度器airflow可以调度spark处理器执行目标配置脚本,以处理目标数据集。具体步骤可参见图5,是本技术实施例提供的一种spark处理器的处理逻辑的流程示意图。如图5所示,首先设置执行指令,具体是设置自定义类txsparkoperator继承基类baseoperator,其中,算子operator可以理解为任务task的抽象类,而baseoperator也是所有功能性operator的来源。txsparkoperator基于airflow.models.baseoperator可以实现数据转换的功能,txsparkoperator暴露的主要参数包括动态执行器参数execute_file、执行主类参数main_class、执行参数execute_args、spark目录参数spark_home、spark执行模式参数spark_master。然后启动子进程,即启动计算引擎进程,调用计算引擎spark执行目标配置脚本,生成处理指令,具体代码描述为sp=subprocess.popen(spark_cmd)。之后等待spark进程(即子进程)退出,具体代码描述为int code=sp.wait(),在进程退出之前,计算引擎按照处理指令的处理逻辑对目标数据集进行处理,进程退出后得到处理结果。最后判断进程返回码是否为0,即判断处理结果是否满足预设条件,其中满足预设条件即进程返回码为0,代表成功,此时可以关闭计算引擎,停止对目标数据集的处理。反之,代表失败,可以暂停计算引擎,同时给出修正提示信息,帮助调整不符合进程执行逻辑的地方,以使得根据目标配置脚本成功处理目标数据集。
66.其中,调用计算引擎对目标配置脚本进行执行,以生成处理指令的具体过程可以为:先利用计算引擎进程的可编程接口接收目标配置脚本,然后对目标配置脚本进行封装处理,得到可运行类,再基于预置调用函数对可运行类进行调用,生成处理指令。
67.具体的,是根据计算引擎中设置的动态执行器参数execute_file所指示的动态执行器,执行目标配置脚本,生成处理指令。以目标配置脚本是scala代码文件,利用scala执行器处理为例进行说明,请参见图6,是本技术实施例提供的一种scala动态执行器处理逻辑的流程示意图。该动态执行器的处理逻辑步骤的实现细节如下:首先加载scala代码文件,即接收目标配置脚本,具体是通过用于动态执行scala代码的自定义类scalaparser,作为spark任务的入口,从scalaparser入口中读取原始scala代码。然后封装scala代码,具体是通过用于封装原始scala代码的自定义类,scala类也即scalascript封装,同时提供运行上下文,例如sparkcontext、sqlcontext。将读取到的原始scala代码封装为类wrapscript(即可运行类),并继承scalascript,scala代码中可以使用scalascript提供的sparkcontext、sqlcontext上下文进行相关操作,封装后的代码如下:
[0068][0069]
其中,子类wrapscript利用扩展类中的关键字extends继承了父类scalascript,原始scala代码具体封装在重写的方法中,并创建了可运行类wrapscript的对象。接着实例
化scala解释器,即创建scala解释器对象scala.tools.nsc.interpreter.imain,具体代码描述为imain interpreter=new imain(),这个实例化的scala解释器即预置调用函数,利用解释器interpreter可以运行封装后的scala代码,具体代码描述为interpreter.interpret(封装的scala代码),其中封装的scala代码即可运行类的调用处理,最后再检查解释器运行结果是否异常,如果异常,则说明scala代码运行失败,反之则是运行成功。上述步骤生成的代码可视为处理指令,利用该处理指令可以对目标数据集处理,得到处理结果。
[0070]
在利用计算引擎进程的可编程接口接收目标配置脚本的过程中,可以通过自定义的airflow restapi接口读取目标配置脚本,将读取到的目标配置脚本传递给spark处理器可编程接口处理,具体是传递给spark处理器的动态执行器参数所指示的动态执行器所在的scalaparser入口。此外,通过该restapi接口可以用于部署、启动、停止任务流等后端操作。
[0071]
一般而言,scala代码运行后会生成类似于可执行文件的jar包,jar包中对应的是scala代码所涉及的属性、类和方法等,通常会该执行得到的jar包传入spark进行分布式计算,然而动态执行器的开发使得scala代码可以直接传递给spark处理,利用scala动态执行器(相当于spark中内置的jar包)中定义好的属性、类以及方法执行scala代码达到处理目标数据集的功能。采用这样的方式就避免了针对不同的scala代码生成不同的jar包,减少了spark处理jar包的冗余度,进而提高了数据表处理的效率。
[0072]
由于不同业务场景下目的端的数据需求不同,数据源端到目的端的数据表处理,需要指定处理后的目标数据集的存储策略,主要是决定数据写入目标数据表的模式。此步骤中服务器接收到的存储指令就是由用户在具备数据表处理功能客户端上指定的存储策略所生成的指令,请参见图7,是本技术实施例提供的一种存储策略配置的界面示意图。如图7所示,存储策略输入框一栏通过下拉模块展示了覆盖、追加以及去重追加三种模式。除此,还有对目标数据表的一些限制条件,包括时间过滤、条件过滤等进一步对处理之后的目标数据集进行筛选。示例的,当目标数据表是日志数据表,属于持续增长类型的数据,只需要将当前最新的数据加入目标数据表中,而不需要关注目标数据表中已经存储的历史数据,此时存储策略可以定义为追加模式,即将新数据追加到目标数据表中。需要说明的是,根据存储策略的不同生成的存储指令不同,在基于接收到的存储指令对处理后的目标数据集进行存储处理时,根据不同的存储指令执行的处理逻辑也有所区别,对于具体的存储指令下对处理后的目标数据集存储至目标数据表的过程可参见下述实施例。
[0073]
综上所述,本技术实施例至少具有如下优点:
[0074]
针对获取到的多张原始数据表,可以接收到全量采集指令或增量采集指令对数据进行采集处理,得到多张原始数据集,基于接收到的连接指令对多张原始数据表建立连接,将多个原始数据集关联起来,使得数据处理更加高效;将建立连接后的原始数据集转换为目标数据集,为数据写入目标数据表做了充分的准备,目标数据集采用spark dataframe对象,辅助提升了数据表处理的效率,基于目标数据集各数据项的配置指令自动生成目标配置脚本,避免了人工编写数据转换脚本,其中,spark处理器分布式计算实现数据转换,以及动态执行器动态执行目标配置脚本,兼顾了灵活性和扩展性。
[0075]
请参见图8,是本技术实施例提供的一种数据表方法的流程示意图,该实施例中的
执行主体可以是一个计算机设备或者是多个计算机设备构成的集群,该计算机设备可以是终端设备,也可以是服务器,此处,以本实施例中的执行主体为服务器(如图1所示的数据表处理设备100)为例进行说明。其中,该数据表处理方法至少可以包括以下步骤s801-s806:
[0076]
s801,取多张原始数据表,并基于接收到的采集指令采集各张原始数据表中的数据集,得到多个原始数据集。
[0077]
s802,基于接收到的连接指令将所述多个原始数据集建立连接,并对建立连接后的各个原始数据集进行转化处理,得到目标数据集。
[0078]
s803,接收针对所述目标数据集中各个数据项的配置指令。
[0079]
上述步骤的具体实现方式可参见上述图2对应实施例中的s201-s203,这里不再进行赘述。
[0080]
s804,获取到每个数据项的配置指令对应的代码模块。
[0081]
在一种可能的实施例中,每个数据项是目标数据集中的数据项,针对这个数据项在前端可视化界面中配置的字段转换规则即代表一个配置指令,终端设备使用开源的代码工具可以实现转换规则智能提示和解析,例如在线代码编辑器codemirror,以及javascript代码分析引擎tern,辅助增强codemirror的javascript代码智能编辑能力,两者结合可以实现字段转换规则的智能提示。对于字段转换规则的解析具体实现内容如下:首先要定义spark内置函数的语法格式,例如累加函数add,该函数功能是累加两个不同列之间的数据。其语法格式如下:
[0082][0083]
然后使用快速javascript解析器acorn,将用户输入的字段转换规则解析为抽象语法树(abstract syntax tree,ast),再将ast转换为有效规则代码,这里对于一个spark内置函数转换的有效规则代码即为一个代码模块。如上述add函数涉及的数据项为列col1和列col2对应的数据,对这两个数据项集合来说,配置指令指示该add函数解析出有效规则代码即为配置指令对应的代码模块。从更宽泛的方向理解,也可将字段作为一个数据项,如列col1即为一个数据项,具体配置指令是基于字段配置,根据有效规则代码可以处理字段所包含的数据。对于其他自定义的函数或内置的函数,均可以以同样的方式得到代码模块,预先存储在数据库中,以备接收到数据项配置指令时及时获取到对应代码模块。
[0084]
s805,基于所述表连接树确定各个代码模块对应的组合逻辑,并基于所述组合逻辑对所述各个代码模块进行组合,得到目标配置脚本。
[0085]
在一种可能的实施例中,表连接树表示的是各原始数据集之间的连接关系,根据该连接关系,各数据项之间也存在组合逻辑,例如原始数据集a左连接原始数据集b,那么原始数据集a作为主表,原始数据集b的数据应当以原始数据集a为准进行关联,关联的是在原
始数据集a中存在字段的数据。基于这样的组合逻辑,可以将各数据项的配置指令对应的代码模块进行组合,得到目标配置脚本。
[0086]
s806,基于目标配置脚本对目标数据集进行处理,并基于接收到的存储指令将处理后的目标数据集存储至目标数据表中。
[0087]
在一种可能的实施例中,基于目标配置脚本对目标数据集进行处理可参见前述实施例的详细描述,在此不再赘述。此步骤主要描述如何根据不同的存储指令将处理后的目标数据集存储至数据表中。根据前述提及的存储策略对应的存储指令可以包括覆盖存储指令、追加存储指令、去重追加存储指令三种,下面以去重追加存储指令作为示例,对基于接收到的去重追加存储指令将待处理后的目标数据集存储至目标数据表中的具体步骤进行描述。具体内容如下:
[0088]
首先将已有数据集左连接目标数据集,得到合并数据集。左连接处理以已有数据集作为主表,目标数据集作为副表,在连接时可以以已有数据集的主键作为连接标准,连接上的数据就是目标数据集中的数据,没有连接上的数据(即主表和副表匹配不上的数据)用null进行填充,最终可以得到合并数据集。示例的,若主表中的某学生的成绩字段中的数据为90或者为null,副表中某学生的成绩字段为92,左连接的条件是成绩字段相同,而这两个数据不相同,则会记录该成绩字段为null,然后可以基于目标数据集中的数据对合并数据集中数据为空的数据项进行填充,得到填充数据集,仍旧以上述示例作为说明,也就是将副表中的92替换掉null,生成一个新的数据集,最后将所述填充数据集以覆盖方式存储至所述目标数据表中,完成数据的更新或追加。当然针对相同的数据,则不更新,此时体现的是去重处理。
[0089]
作为另一种可选的方式,对基于接收到的去重追加存储指令将待处理后的目标数据集存储至目标数据表中的具体步骤还可以是:首先确定出目标数据集中各主键为空的数据项,其中,主键可以是目标数据集中的一个或多个字段(或称为属性组),用于唯一标识目标数据集中的一条记录。示例的,学生表(学号,姓名,性别,班级),其中每个学生的学号是唯一的,学号就是一个主键,成绩表(学号,课程号,成绩)成绩表中单一的一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键,对应的主键为空的数据项则表示目标数据集中没有和已有数据集主键的数据集所对应的数据。然后基于各主键为空的数据项构建出空数据集,具体是将获取到的目标数据表的已有数据集和没有主键的目标数据集进行左连接,即以已有数据集作为主表,将目标数据集中和已有数据集中相同的字段筛选出来,合并成一张数据表,将这张数据表称为空数据集。接着将空数据集和目标数据集进行求并处理,得到合并数据集。最后将合并数据集以覆盖方式写入目标表中,这样若新数据主键在已有数据集中存在则可以进行更新处理,如果不存在,根据求并处理,可以将新数据主键新增到已有数据集中。
[0090]
示例的,有如下学生信息表和学生成绩表分别作为已有数据集和目标数据集,已有数据集的主键为s_id,目标数据集的主键为sc_id:
[0091]
学生信息表
[0092]
s_ids_names_birth1张三1991-122李四1994-01
3王五1995-034郑二1997-04
[0093]
学生成绩表
[0094]
sc_idc_ids_source100188200295300373500494
[0095]
将这两张表进行左连接可以得到如下所示的表,作为空数据集。
[0096]
s_ids_names_birthsc_idc_ids_source1张三1991-121001882李四1994-012002953王五1995-033003734郑二1997-04nullnullnull
[0097]
可以发现,上述表中学生成绩表(作为目标数据集)中在学生信息表中(作为已有数据表)中不存在主键对应的数据的记录为空null,然后将目标数据集和该空数据集求并处理得到的数据如下所示,将数据集按照覆盖模式存储目标数据表:
[0098]
s_ids_names_births_idc_ids_source1张三1991-121001882李四1994-012002953王五1995-033003734郑二1997-04nullnullnullnullnullnull500494
[0099]
值得注意的是,虽然存储指令为去重追加存储,但是最终将数据集写入目标数据表的模式是覆盖模式,而这里的覆盖模式是可以体现出在对目标数据表的已有数据集中没有的关键字段(或主键)对应的数据进行追加,对已存在的主键数据进行更新的原理,去重则可以理解为同一主键所对应的一条数据记录中,在已有数据集和目标数据集中都相同的数据则不更新。
[0100]
结合前述图2的实施例中对原始数据表的增量采集指令和本实施例中的去重追加存储指令可以提供一种数据表处理方案。请参见图9,是本技术实施例提供的一种增量采集和去重追加存储模式下的数据表处理流程的示意图。这种模式每次执行任务会根据目标数据表主键来处理,新数据主键在目标数据表中存在则更新,不存在则新增,用于持续增长且需唯一的数据,具体步骤为:首先读取目标数据表数据集cdf(即目标数据表的已有数据集),该目标数据表数据集可以是dwd、dws、dim、ads中任一层的编目表集合,获得目标数据表数据集后计算cdf最大时间戳mt(或者为其他能在更新时递增的标识),最大时间戳作为更新递增的标识,可以为增量采集数据集提供参照标准。因此可以将原始数据表中时间戳大于该最大时间戳的数据作为采集对象,进行数据采集并生成数据集df(已对建立连接的表进行转换处理,得到的目标数据集),之后在数据集上进行自定义操作(即配置字段转换
规则、存储策略等),接着计算cdf左连接df,并且df主键为空的数据集edf(即空数据集),再计算df与edf的并集udf(即合并数据集),最后将udf以覆盖(overwrite)方式写入目标数据表中。
[0101]
除了上述增量采集和去重追加存储模式的数据表处理流程,还有其他组合模式下的数据表处理流程。请参见图10,是本技术实施例提供的一种增量采集和追加存储模式下的数据表处理流程的示意图,这种模式每次执行任务都会追加新数据到目标数据表中,用于持续增长类型的数据,如日志。具体步骤如图10所示,首先读取目标数据表数据集cdf(即目标数据表的已有数据集),然后计算cdf最大时间戳mt或者为其他能在更新时递增的标识,接着读取原始数据表的主表(即原始数据表1)中时间戳大于mt的数据集,即对主表中的数据进行增量采集,得到原始数据集,同时对其他原始数据表(原始数据表2~n)进行全量读取,共生成n个原始数据集,将n个原始数据集进行表连接操作,包括inner join、left join、right join、full join、cross join,得到数据集df,在df上进行自定义操作(同图9中的自定义操作,如配置字段转换规则和存储策略),最后以追加(append)方式将根据自定义操作处理后的目标数据集写入目标数据表。
[0102]
请参见图11,是本技术实施例提供的一种全量采集和追加存储模式下的数据表处理流程的示意图,这种模式每次执行任务都会追加新数据到目标数据表中,常用于完整数据备份,具体步骤如图11所示,首先全量读取各原始数据表1~n,生成n个原始数据集,即全量读取的每张原始数据表都对应一个原始数据集,然后将各原始数据集进行表连接操作,包括inner join、left join、right join、full join、cross join,得到数据集df,接着在df上进行自定义操作,最后将df以追加方式写入目标数据表。
[0103]
请参见图12,是本技术实施例提供的一种全量采集和覆盖存储模式下的数据表处理流程的示意图,这种模式每次执行任务都会清空目标数据表中原有数据,用于整体数据更新。具体步骤如图12所示,首先全量读取原始数据表1~n,生成n个原始数据集,然后将n个原始数据集进行表连接操作,包括inner join、left join、right join、full join、cross join,得到数据集df,接着在df上进行自定义操作,最后将df以覆盖方式写入目标数据表,即将df中包括的所有数据都写入目标数据表,完成对目标数据表的更新。可选的,在此模式下,执行任务时也可以不用清空原有数据,而是在得到目标数据后将目标数据表中的原有数据进行替换,达到更新目的。和上述图11所示的全量采集和追加存储模式的不同之处在于,最终写入目标数据表的方式是覆盖方式,采用此存储模式需要对目标数据表所有数据进行更新,而追加存储模式只需要更新目标数据表的部分数据。
[0104]
由上述示例的不同模式组合下的数据表处理流程方案可以看出,在全量模式下,可以使用多表进行连接,在增量模式下,为了防止多个增量表数据连接导致数据紊乱,一般使用单表,为更大范围满足业务上的场景,也可以采用单个主表增量模式和多个副表全量模式进行多表连接(如图10)。对本技术抽象的数据采集和数据存储模式进行组合,可以满足不同业务需求的数据表处理方法,针对不同模式,合成不同的spark脚本,这里的spark脚本包括各种指令得到的预设的代码模块,将这些代码模块按照指定的逻辑关系组合即spark脚本。虽然每种模式下脚本的处理流程不同,但能灵活适应目前绝大多数业务场景下的数据处理需求。当然针对未示出的组合模式(如全量采集和去重追加存储模式),其适用的业务场景还有待挖掘。
[0105]
综上所述,本技术实施例至少具有如下优点:
[0106]
本技术实施例提供的数据表处理方案是基于任务调度框架airflow开发的完整数据etl处理框架,将etl不同阶段的功能抽象出来,如在数据转换阶段利用配置指令拉取对应的预设的代码模块,合成目标配置脚本,实现字段级别转换,使得数据表的数据转换更快速,在数据存储阶段,根据存储指令指示的存储模式将转换后的目标数据集写入目标数据表。将采集指令、配置指令、存储指令等抽象出来,设置对应的代码模块,针对相同指令下对应的脚本,可以实现代码复用,提高系统的轻便度,且通过组合不同的指令能够灵活多变地处理数据表,能够处理多种模式下的数据业务,如增量采集和去重追加存储、增量采集和追加存储等,针对大规模的数据处理兼容了各种复杂场景的需求,使用方便灵活,扩展性好。
[0107]
请参阅图13,为本技术实施例提供的一种数据表处理装置的结构示意图。本技术实施例中所描述的数据表处理装置,对应于前文所述的计算机设备。该数据表处理装置可以是运行于图1所示的数据表处理设备100中的一个计算机程序(包括程序代码),例如数据表处理装置为一个应用软件;该装置可以用于执行本技术实施例提供的数据表处理方法中的相应步骤。该数据表处理装置130包括:采集模块1301、连接模块1302、转换模块1303、配置模块1304、处理模块1305、存储模块1306,其中:
[0108]
采集模块1301,用于获取多张原始数据表,并基于接收到的采集指令采集各张原始数据表中的数据集,得到多个原始数据集。
[0109]
连接模块1302,用于基于接收到的连接指令将多个原始数据集建立连接。
[0110]
转换模块1303,用于对建立连接后的各个原始数据集进行转化处理,得到目标数据集。
[0111]
配置模块1304,用于接收针对目标数据集中各个数据项的配置指令,并基于各个数据项的配置指令构建出目标配置脚本。
[0112]
处理模块1305,用于基于目标配置脚本对目标数据集进行处理。
[0113]
存储模块1306,用于基于接收到的存储指令将处理后的目标数据集存储至目标数据表中。
[0114]
在一实施例中,采集模块1301具体用于:获取目标数据表中的已有数据集,并确定已有数据集中的目标时间戳,目标时间戳为已有数据集中各个数据项的时间戳中最大的时间戳;确定各张原始数据表中时间戳大于目标时间戳的至少一个原始数据项;基于至少一个原始数据项构建出多张原始数据表对应的多个原始数据集。
[0115]
在一实施例中,转换模块1303具体用于:获取建立连接后的各个原始数据集中的目标原始数据集,目标原始数据集作为根节点与各个原始数据集建立连接;以目标原始数据集为起点,对各个原始数据集进行遍历,构建出建立连接后的各个原始数据集对应的表连接树,表连接树用于指示各个原始数据集之间的连接关系;基于表连接树生成连接关系查询表达式,并基于连接关系查询表达式对各个原始数据集进行处理,得到目标数据集。
[0116]
在一实施例中,配置模块1304具体用于:获取到每个数据项的配置指令对应的代码模块;基于表连接树确定各个代码模块对应的组合逻辑,并基于组合逻辑对各个代码模块进行组合,得到目标配置脚本。
[0117]
在一实施例中,存储模块1306具体用于:将已有数据集左连目标数据集,得到合并数据集;基于目标数据集中的数据对合并数据集中数据为空的数据项进行填充,得到填充
数据集;将填充数据集以覆盖方式存储至目标数据表中。
[0118]
在一实施例中,处理模块1305具体还用于:启动计算引擎进程,并调用计算引擎对目标配置脚本进行执行,以生成处理指令;基于处理指令对目标数据集进行处理,得到处理结果;若处理结果满足预设条件,则关闭计算引擎进程,以停止对目标数据集的处理。
[0119]
在一实施例中,处理模块1305具体还用于:利用计算引擎进程的可编程接口接收目标配置脚本;对目标配置脚本进行封装处理,得到可运行类;基于预置调用函数对可运行类进行调用,生成处理指令。
[0120]
可以理解的是,本技术实施例所描述的数据表处理装置的各功能模块的功能可根据上述数据表处理方法实施例中的相关方法具体实现,其具体实现过程可以参照上述方法实施例的相关描述,在此不再赘述。另外,对采用相同数据表处理方法的有益效果描述,也在此不再赘述。
[0121]
请参见图14,是本技术实施例提供的一种计算机设备的结构示意图,该计算机设备140可以包括处理器1401、存储器1402、网络接口1403和至少一个通信总线1404。其中,处理器1401用于调度计算机程序,可以包括中央处理器、控制器、微处理器;存储器1402用于存储计算机程序,可以包括高速随机存取存储器,非易失性存储器,例如磁盘存储器件、闪存器件;网络接口1403提供数据通信功能,通信总线1404负责连接各个通信元件。该计算机设备140对应于前文的数据表处理设备100。
[0122]
其中,处理器1401可以用于调用存储器中的计算机程序,以执行如下操作:
[0123]
获取多张原始数据表,并基于接收到的采集指令采集各张原始数据表中的数据集,得到多个原始数据集;基于接收到的连接指令将所述多个原始数据集建立连接,并对建立连接后的各个原始数据集进行转化处理,得到目标数据集;接收针对所述目标数据集中各个数据项的配置指令,并基于所述各个数据项的配置指令构建出目标配置脚本;基于所述目标配置脚本对所述目标数据集进行处理,并基于接收到的存储指令将处理后的目标数据集存储至目标数据表中。
[0124]
在一实施例中,处理器1401具体用于:获取目标数据表中的已有数据集,并确定已有数据集中的目标时间戳,目标时间戳为已有数据集中各个数据项的时间戳中最大的时间戳;确定各张原始数据表中时间戳大于目标时间戳的至少一个原始数据项;基于至少一个原始数据项构建出多张原始数据表对应的多个原始数据集。
[0125]
在一实施例中,处理器1401具体用于:获取建立连接后的各个原始数据集中的目标原始数据集,目标原始数据集作为根节点与各个原始数据集建立连接;以目标原始数据集为起点,对各个原始数据集进行遍历,构建出建立连接后的各个原始数据集对应的表连接树,表连接树用于指示各个原始数据集之间的连接关系;基于表连接树生成连接关系查询表达式,并基于连接关系查询表达式对各个原始数据集进行处理,得到目标数据集。
[0126]
在一实施例中,处理器1401具体用于:获取到每个数据项的配置指令对应的代码模块;基于表连接树确定各个代码模块对应的组合逻辑,并基于组合逻辑对各个代码模块进行组合,得到目标配置脚本。
[0127]
在一实施例中,处理器1401具体用于:将已有数据集左连目标数据集,得到合并数据集;基于目标数据集中的数据对合并数据集中数据为空的数据项进行填充,得到填充数据集;将填充数据集以覆盖方式存储至目标数据表中。
[0128]
在一实施例中,处理器1401具体用于:启动计算引擎进程,并调用计算引擎对目标配置脚本进行执行,以生成处理指令;基于处理指令对目标数据集进行处理,得到处理结果;若处理结果满足预设条件,则关闭计算引擎进程,以停止对目标数据集的处理。
[0129]
在一实施例中,处理器1401具体用于:利用计算引擎进程的可编程接口接收目标配置脚本;对目标配置脚本进行封装处理,得到可运行类;基于预置调用函数对可运行类进行调用,生成处理指令。
[0130]
具体实现中,本技术实施例中所描述的处理器1401、存储器1402及网络接口1403可执行本技术实施例提供的一种数据表处理方法中所描述的计算机设备的实现方式,也可执行本技术实施例提供的一种数据表处理装置中所描述的实现方式以及有益效果,在此不再赘述。
[0131]
本技术实施例还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行如本技术实施例所述的数据表处理方法。其具体实现方式可参考前文描述,此处不再赘述。
[0132]
本技术实施例还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取计算机指令,处理器执行计算机指令,使得计算机设备执行如本技术实施例的数据表处理方法。其具体实现方式可参考前文描述,此处不再赘述。
[0133]
需要说明的是,对于前述的各个方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本技术并不受所描述的动作顺序的限制,因为依据本技术,某一些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本技术所必须的。
[0134]
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(read-only memory,rom)、随机存取器(random access memory,ram)、磁盘或光盘等。
[0135]
以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以权利要求的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献