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

基于SARP数据处理规则编译方法及数据处理方法与流程

2021-12-04 13:19:00 来源:中国专利 TAG:

基于sarp数据处理规则编译方法及数据处理方法
技术领域
1.本发明涉及sarp数据处理技术领域,具体为一种基于sarp数据处理规则编译方法及数据处理方法。


背景技术:

2.sarp2000软件在个人电脑普及初期具有较高的先进性,但随着互联网、大数据、云计算、人工智能时代的到来,其先天不足逐渐表现出来。首先,由于是单机版软件,数据处理的数据量和效率取决于所安装的单机硬件性能高低,无法满足海量数据处理需求,同时单机软件也不能满足网络版所能提供的多人同时访问并发响应能力;其次,此软件只能运行在windows操作系统环境中,不能运行在国产化要求的国产操作系统中,需要采用java等跨平台开发环境;第三,由于数据处理没有采用多线程技术,不能并行运算,在目前多cpu、超线程的服务器或个人电脑上只能实现单线程运算,无法充分发挥硬件资源的算力;第四,采用自定义格式的二进制文件存储数据,没有采用大型数据库存储数据,造成数据存取效率较低。
3.各级统计部门为了解决sarp2000软件的不足,逐步采用了其它很多解决方案。这些方案的数据处理描述主要包括三种方式,第一种是采用类似高级程序语言编程,第二种是直接采用结构化查询语言(sql)编程,第三种是通过将可视化编辑方式定义规则后由程序转化成结构化查询语言(sql)。第一种方式,虽然可以处理复杂的业务逻辑,但统计业务工作人员几乎无法掌握,并且对软件的算法要求高,往往不能支撑海量数据的处理。第二种方式,不仅业务人员无法掌握,复杂业务逻辑描述困难,而且对于复杂业务逻辑的处理运行效率较低,数据处理的压力完全作用于难以并行扩展的数据库服务器,严重影响数据库访问效率。第三种方式,业务人员较容易掌握,但很难通过点选的可视化操作描述复杂逻辑规则,并且不能支撑复杂逻辑的海量数据处理能力。


技术实现要素:

4.本发明的目的在于提供一种基于sarp数据处理规则编译方法及数据处理方法,以解决上述背景技术中提出的问题。
5.为了解决上述技术问题,本发明提供如下技术方案:一种基于sarp数据处理规则编译方法,所述数据编译方法包括以下步骤:
6.步骤s100:预先整理sarp的规则,并将整理后的规则写入一个字符型数据组,设该个字符型数据组为规则数组;
7.步骤s200:查询数据库中某条数据处理规则记录,获取该条数据处理规则记录的更新时间作为该条数据的版本号;
8.步骤s300:生成定义java程序中的公共的类,包括分开申明主进程程序中使用的变量和线程程序中使用的变量;
9.步骤s400:遍历规则数组找到名录表,将各个名录库相关参数信息以及相关参数
信息的取值存入名录表数组中;
10.步骤s500:遍历规则数组找到报表,将各个报表相关参数信息以及相关参数信息的取值存入报表数组中;
11.步骤s600:遍历规则数组找到语法关键字,对规则数组中sarp的规则中的条件语句、循环语句、审核语句、直接转换语句、计算语句、汇总语句和表达式进行编译处理,转换成java程序;
12.步骤s700:将执行审核语句、计算语句和汇总语句时的生成数据写入数据库的java程序中。
13.进一步的,所述步骤s600中对循环语句进行编译处理包括:
14.如果规则数组中某条sarp规则的格式为“do循环变量=开始值终止值步长”,判断该条sarp规则中是否包含特征规则后,线程程序生成对应开始值、终止值和步长的java格式的循环语句;
15.如果规则数组中某条sarp规则的格式为“do循环变量=值1,值2,

,值a”,a为自然数,那么,线程程序生成遍历值1到值a的java格式的循环语句;
16.其中,所述判断该条sarp规则中是否包含特征规则包括:当该条sarp规则中包含“.rlen”或“.clen”,主进程程序生成各种报表的主栏或宾栏长度变量值,当该条sarp规则中包含“.count”,主进程程序生成单位名录库的单位个数的变量值代码。
17.进一步的,所述步骤s600中对汇总语句进行编译处理包括:
18.所述汇总语句包括汇总总条件语句、汇总取数语句、汇总条件语句和分组汇总语句,其中,
19.所述汇总语句包括汇总总条件语句、汇总取数语句、汇总条件语句和分组汇总语句,其中,
20.当规则数组中某条sarp规则为汇总总条件语句时,将汇总总条件语句中的表达式转换成条件判断程序,执行完条件判断程序后筛选出满足条件的单位进行汇总;
21.当规则数组中某条sarp规则为汇总取数语句时,包括以下步骤:
22.①
将所有的汇总取数语句分别存入各个取数标签数组;
23.②
遍历各个取数标签数组,解析各取数标签数组的元素后,将元素存入汇总取数数组;
24.③
遍历汇总取数数组,将各报表取数坐标存到数组中并生成java格式的线程程序;
25.当规则数组中某条sarp规则为汇总条件语句时,包括以下步骤:
26.①
将所有的汇总条件语句分别存入各个条件标签数组;
27.②
遍历各个条件标签数组,解析各条件标签数组中的元素后,将元素存入汇总条件数组;
28.③
遍历汇总条件数组,如果汇总条件数组中的条件以“t_group”开始,那么采集参数指定的名录库分组属性中的分组值作为条件表达式,否则,提取汇总条件数组中的名录库中的单位属性条件作为条件表达式;
29.④
分解汇总条件数组的条件表达式得到多个表达式,对表达式进行编译处理,生成java格式的线程程序;
30.当规则数组中某条sarp规则为分组汇总语句时,包括以下步骤:
31.①
遍历分组汇总语句中的每个字符,获取其中的分组汇总标签,并根据分组汇总标签从分组汇总语句中提取条件组和取数组,并获取条件组和取数组中的取数分量,设提取的条件组和取数组分别为总t、总q,如果条件t组中的内容包括取数q的内容,那么交换总t和总q的内容,并用变量记录左括号组中的是主条件,
32.其中,分组汇总标签包括两组括号,条件组为分组汇总标签中两种括号组中括号括起来的内容仅包括条件标签的那一组,取数组为分组汇总标签中两种括号组中的另一组,条件t组为分组汇总标签中两组括号括起的条件分量和取数组中的条件分量,取数q为分组汇总标签中的两组括号括起的条件分量和取数组中的取数分量,左括号组为分组汇总标签中的两组括号位于左边那个括号组,主条件为两组括号内只有条件分量没有取数分量的那个条件组;
33.②
执行编译取数组中的取数标签,返回各种相关变量与状态值,并追加到线程代码供主程序调用;
34.③
将总q的取数分量存入二维数组,其中,二维数组的第一维是“ ”分隔的段,二维数组的第二维是“*”分隔的段;
35.④
循环处理各个取数组,如果总q的某个分量的格式不是q*t格式,其中,q为取数标签,t为条件标签,那么将该个分量的格式转化为q*t格式后,再对q*t进行处理后,并将处理后的数据存入相关数组;
36.⑤
执行编译汇总条件语句中的条件标签,返回各种相关变量与状态值,并追加到线程代码;
37.⑥
线程代码增加各单位遍历循环代码,开始处理汇总名录表中的各单位的数据,汇总对所有单位只处理一次,满足条件的单位调取相关数据汇总即可;
38.⑦
分解组合各汇总条件语句的段与层,
39.如果汇总条件语句的段与层中包括t、*和q,那么某个汇总条件语句的某个分量便为t*q型,生成判断t*q中的t的真假的程序,其中,生成判断t*q中的t的真假的程序为判断t*q中的q是否满足t当中的条件,如果q满足t当中的条件,那么q参与后续的汇总;
40.接着,如果发现汇总条件语句存在(t1 t2)格式,那么合并t1和t2中的条件内容,其中,t1,t2为汇总条件语句中的两个不同的条件标识;
41.⑧
处理第一个汇总名录表中的单位时获取所有条件标签的长度,在执行汇总条件时获取t_group中的条件的个数;
42.⑨
循环遍历所有条件组中的条件,如果某个条件组中的条件满足汇总条件语句中的分组条件,那么再循环遍历所有并汇总到相应的汇总表单元格,如果汇总条件语句中出现了“t_group”,那么遍历条件组的元素并汇总到相应的汇总表单元格,否则,汇总计数数量加1,其中,汇总计数数量的初始值为0。
43.进一步的,所述步骤s600中对表达式进行编译处理包括:
44.①
判断表达式的类型,当表达式的类型为条件表达式时,通过分隔符将该条件表达式分隔成多个子表达式,转步骤


45.②
生成每个子表达式的java申明程序;
46.③
找出每个子表达式的操作符,并据此分辨出子表达式的左式和右式;
47.④
顺着左式往右式的方向遍历每个子表达式的每个sarp关键字,每找到一个sarp关键字,将该个关键字转换成成相应的可供调用的java格式的执行代码和参数。。
48.进一步的,所述步骤s600中每找到一个sarp关键字还包括:
49.优先判断关键字的类型,
50.当关键字为函数、变量、名录库属性、报表单元格中的一种;
51.如果关键字为函数,从函数中分离出函数名和参数,分别转换成java的自定义函数和参数;
52.如果关键字为变量,将变量转换成java自定义变量名称;
53.如果关键字为名录库属性,将sarp的z格式或者z[p]格式转换成java的数组访问格式z[名录库索引][单位索引][属性坐标索引],其中,z表示名录库别名,p为自然数,p表示名录库中的单位属性的序号,
[0054]
如果关键字为报表单元格,其中,a表示报表别名,ad表示存放所有报表数据的多维数组变量名,
[0055]
当规则数组中sarp格式为“a[行序号,列序号]”,将其转换成java的数组访问格式“ad[报表索引][单位索引][单元格坐标索引]”,
[0056]
当规则数组中sarp格式为“a[行号,列序号]”,则要先将行号转换成索引号,再转换成java的数组访问格式“ad[报表索引][单位索引][单元格坐标索引]”;
[0057]
当规则数组中sarp格式为“a[母表行序号,母表列序号^子表行序号,子表列序号]”,将其转换成java的数组访问格式“ad[报表索引][单位索引][母表单元格坐标索引][子表单元格坐标索引]”;
[0058]
当关键字为除函数、变量、名录库属性、报表单元格以外的关键字,直接转换成对应的java格式的语句。
[0059]
一种应用基于sarp数据处理规则编译方法的数据处理方法,所述数据处理方法包括数据处理任务调度运行方法,所述数据处理任务调度方法包括:
[0060]
预先查找当前处于空闲状态的m台中间件服务器,将各张报表的运算任务排队分配给这m台中间件服务器;
[0061]
当这m台中间件服务器接收到运算任务时,将运算任务分配给多个线程排队并发执行,所述运算任务包括报表运算、汇总单位运算和样本单位运算;
[0062]
其中,当存在k张报表上的数据相互关联,先将k张报表之间串行后传输给中间件服务器进行运算。
[0063]
进一步的,所述数据处理方法包括数据处理运算方法,所述数据处理运算方法还包括:
[0064]
将名录库以关系型物理表的形式存储,当名录库中的基层单位填报报表时,每张报表的各种相关数据存储在一张关系型物理表中;
[0065]
采集基层单位数据时,将每个样本单位的每张报表数据按键值格式存储在一条记录的一个字段中,其中,键是每张报表的每个单元格分配的全局唯一识别号,使用物理表存储单元格元素编码组合与全局唯一识别号的映射关系,单元格元素包括指标、分组和目录;
[0066]
每次取数量参数,分批取出当前主名录库的单位及其关联名录库的单位。
[0067]
进一步的,所述数据处理任务调度运行方法还包括任务调度的响应机制,包括:
[0068]
根据服务器的硬件资源调节可用线程的数量;
[0069]
使得一定数量的硬件资源处于空闲状态,用于响应其他任务优先执行;
[0070]
监听到各服务器的各个线程,当某个线程完成任务后,会安排其它排队等候的任务到空闲资源继续执行,直到所有细分的子任务全部执行完成;
[0071]
监控每台服务器的资源占用情况动态增减线程数量;
[0072]
动态分配给服务器的线程数小于等于预设阈值。
[0073]
与现有技术相比,本发明所达到的有益效果是:本发明针对sarp2000这个软件在功能、性能、应用环境、架构等方面不足,继承使用并改进了sarp统计数据处理描述语言,采用跨平台java语言自主全新研发b/s架构跨平台网络版统计数据采集与处理平台软件。同时,设计在应用层运行的多服务器、多线程数据处理方法,在处理复杂的数据处理逻辑和海量数据处理能力方面实现突破。
附图说明
[0074]
附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
[0075]
图1是本发明基于sarp数据处理规则编译方法示意图。
具体实施方式
[0076]
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0077]
sarp语言需要提供对基本单位名录库、基层报表、汇总单位名录库、汇总报表的数据审核、计算,以及对汇总报表的汇总的数据处理能力。基本单位名录库是调查对象的样本库,包括了编码、名称、自定义分组属性、自定义文本属性;基层报表就是基本单位名录库的样本相关的统计报表指标数据存储的载体;汇总单位名录库就是汇总单位的对象库,如按各级行政区域作为汇总单位,或虚拟方式划定的地区等,可以由用户自由定义并设置基本单位名录库中的样本范围条件;汇总报表就是按照汇总单位名录库中的汇总单位作为汇总目标单位,根据各汇总单位的基本单位样本范围和汇总报表中设置的汇总条件进行基层报表的取数求和、计数等聚合分析后以报表形式存储数据的载体。
[0078]
请参阅图1,本发明提供技术方案:一种基于sarp数据处理规则编译方法,所述数据编译方法包括以下步骤:
[0079]
步骤s100:预先整理sarp的规则,并将整理后的规则写入一个字符型数据组,设该个字符型数据组为规则数组;
[0080]
包括去除注释、增加行号、删除空行、删除多余空格、格式整理、提示错误等
[0081]
步骤s200:查询数据库中某条数据处理规则记录,获取该条数据处理规则记录的更新时间作为该条数据的版本号,获得版本号是为了生成编译文件名;
[0082]
步骤s300:生成定义java程序中的公共的类,包括分开申明主进程程序中使用的变量和线程程序中使用的变量;
[0083]
具体包括:
[0084]
申明主进程程序字符串变量和线程程序字符串变量;
[0085]
生成编译文件名程序,根据不同功能的程序和公式编码生成相应的程序文件名;
[0086]
主进程程序增加引入公共相关程序包和各种数据处理类型的相关程序包;
[0087]
针对不同类型的数据处理主进程程序生成特有的引入程序包,并生成各种数据处理类申明程序,抽象类通过java接口和java实现技术实现;
[0088]
主进程程序增加申明各种数据处理类型的公共变量名称;
[0089]
线程程序增加申明各种数据处理类型的线程子类和线程变量;
[0090]
主进程程序增加申明各种数据处理类型的取报表数据的类变量;
[0091]
主进程程序增加申明各种数据处理类型的线程变量
[0092]
线程程序增加各种数据处理类型的线程内变量申明,以及主进程程序变量输入赋值给线程变量的方法;
[0093]
线程程序增加各种数据处理类型中每个单位数据处理的变量初始化方法;
[0094]
线程程序增加各种数据处理类型执行数据处理类,各种数据处理的方法相似,只是变量有所不同,具体方法如下:
[0095]
线程程序增加申明得到当前线程处理分批单位数据的类变量;
[0096]
线程程序增加执行当前线程处理分批单位数据的方法;
[0097]
线程程序增加执行当前线程处理分批单位数据方法的返回变量值,并将其赋值本地变量;
[0098]
线程程序增加循环本批所有单位;
[0099]
线程程序增加执行变量初始化。
[0100]
步骤s400:遍历规则数组找到名录表,将各个名录库相关参数信息以及相关参数信息的取值存入名录表数组中,名录库相关参数信息主要包括名录库别名、名录库编码、主名录库主键位、次名录库位、规则中出现的属性或状态位的字段别名、名录库内码、名录库主次类型及主次名录库的关联关系、名录库更新字段别名、父名录库内码、主次名录库关联合并属性、名录库是基层名录库还是汇总名录库、规则中打开名录库的各种参数、当前名录库单位范围条件、名录库用途类型等;
[0101]
步骤s500:遍历规则数组找到报表,将各个报表相关参数信息以及相关参数信息的取值存入报表数组中,报表相关参数信息主要包括报表别名、报表编号、表式类型、报告期参数、报表表内码、报表期类型、表行数、表列数、相关名录库内码、名录库编码、各种报表基本信息数值、所属名录库在opz数组中的序号、是否取报表核状态、所取报表名状态值的字段名称、派生表的各级父表内码、各级派生表的内码、有无字符格、派生表创建人内码、更新属性字段名、子表信息(子表内码、了表所有行序号、子表编码、子表类型、主栏行数、主栏列数、宾栏行数、宾栏列数、主栏有行号行数、计量单位位置、计量单位名称)、子表个数、子表有无台帐表等;
[0102]
步骤s600:遍历规则数组找到语法关键字,对规则数组中sarp的规则中的条件语句、循环语句、审核语句、直接转换语句、计算语句、汇总语句和表达式进行编译处理,转换成java程序;
[0103]
遍历各行sarp规则,如出现ph(首次填前计算或汇前计算)、js(填后计算或汇后计
算)、co(汇总总条件)、fz(分组汇总)、tn(汇总条件)、qn(汇总取数)、pha(每次填前计算)、if(如果)、endif(结束如果)、do(循环)、enddo(结束循环)、continue(继续)、break(中断)、return(返回)、$(表内实时强制审核)、$$(表内非实时非强制审核)、~(表间强制审核)、~~(非强制审核)、^(表内非实时强制审核)、^^(表内实时非强制审核)、if(条件)等语法关键字,则分别转换成java程序,其它内容作为表达式处理。
[0104]
以if开头的语句表示条件判断,表示当if后面的表达式满足与否。
[0105]“$、$$、~、~~、^、^^”以这六种符号开头连接审核提示信息sarp语句表示六种审核方式,程序处理方式相似。$表示表内实时强制审核,$$表示表内非实时非强制审核,~表示表间强制审核,~~表示非强制审核,^表示表内非实时强制审核,^^表示表内实时非强制审核。提示信息是一个字符串,可以是常量,也可以是字符串表达式,因子可以是常量也可以是变量。
[0106]
enddo、return、elseif、endif、break、continue等直接转换语句这些语法与java语法相似,只要直接分别转换成“}”、“return;”、“else if”、“}”、“break;”、“continue;”即可。
[0107]
ph(首次填前计算或汇前计算)、pha(每次填前计算)、js(填后计算或汇后计算)、segment(规则分段)这些是标签语句,当满足功能条件时再执行标签内的数据处理规则,转换成加上条件判断的程序。
[0108]
步骤s700:将执行审核语句、计算语句和汇总语句时的生成数据写入数据库的java程序中。执行审核语句时,需要生成执行审核时产生的审核错误提示和状态标志写入数据库的java程序;执行计算语句时,需要生成执行计算时对各报表数据运算的数组生成json数据写入数据库的java程序;执行汇总语句时,需要生成执行汇总时存储汇总表数组生成json数据写入数据库的java程序。
[0109]
所述步骤s600中对循环语句进行编译处理包括:
[0110]
如果规则数组中某条sarp规则的格式为“do循环变量=开始值终止值步长”,判断该条sarp规则中是否包含特征规则后,线程程序生成对应开始值、终止值和步长的java格式的循环语句;
[0111]
如果规则数组中某条sarp规则的格式为“do循环变量=值1,值2,

,值a”,a为自然数,那么,线程程序生成遍历值1到值a的java格式的循环语句;
[0112]
其中,所述判断该条sarp规则中是否包含特征规则包括:当该条sarp规则中包含“.rlen”或“.clen”,主进程程序生成各种报表的主栏或宾栏长度变量值,当该条sarp规则中包含“.count”,主进程程序生成单位名录库的单位个数的变量值代码。
[0113]
所述步骤s600中对汇总语句进行编译处理包括:
[0114]
所述汇总语句包括汇总总条件语句、汇总取数语句、汇总条件语句和分组汇总语句,其中,
[0115]
当规则数组中某条sarp规则为汇总总条件语句时,将汇总总条件语句中的表达式转换成条件判断程序,执行完条件判断程序后筛选出满足条件的单位进行汇总;
[0116]
当规则数组中某条sarp规则为汇总取数语句时,包括以下步骤:
[0117]

将所有的汇总取数语句分别存入各个取数标签数组;
[0118]

遍历各个取数标签数组,解析各取数标签数组的元素后,将元素存入汇总取数
数组;
[0119]

遍历汇总取数数组,将各报表取数坐标存到数组中并生成java格式的线程程序;遍历汇总取数数组,找到左中括号左侧的内容为报表别名,左中括号和右中括号中间的内容如果是0则表示计单位个数,否则为取数坐标。坐标中逗号的左侧为主栏,右侧为宾栏,主宾栏中用冒号表示连取,用分号表示逐个取,找出各个取数坐标后存储到线程程序的变量数值型数组中
[0120]
当规则数组中某条sarp规则为汇总条件语句时,包括以下步骤:
[0121]

将所有的汇总条件语句分别存入各个条件标签数组;
[0122]

遍历各个条件标签数组,解析各条件标签数组中的元素后,将元素存入汇总条件数组;
[0123]

遍历汇总条件数组,如果汇总条件数组中的条件以“t_group”开始,那么采集参数指定的名录库分组属性中的分组值作为条件表达式,否则,提取汇总条件数组中的名录库中的单位属性条件作为条件表达式;
[0124]

分解汇总条件数组的条件表达式得到多个表达式,对表达式进行编译处理,生成java格式的线程程序;
[0125]
当规则数组中某条sarp规则为分组汇总语句时,包括以下步骤:
[0126]

遍历分组汇总语句中的每个字符,获取其中的分组汇总标签,并根据分组汇总标签从分组汇总语句中提取条件组和取数组,并获取条件组和取数组中的取数分量,设提取的条件组和取数组分别为总t、总q,如果条件t组中的内容包括取数q的内容,那么交换总t和总q的内容,并用变量记录左括号组中的是主条件,
[0127]
其中,分组汇总标签包括两组括号,条件组为分组汇总标签中两种括号组中括号括起来的内容仅包括条件标签的那一组,取数组为分组汇总标签中两种括号组中的另一组,条件t组为分组汇总标签中两组括号括起的条件分量和取数组中的条件分量,取数q为分组汇总标签中的两组括号括起的条件分量和取数组中的取数分量,左括号组为分组汇总标签中的两组括号位于左边那个括号组,主条件为两组括号内只有条件分量没有取数分量的那个条件组;
[0128]
分组汇总包括列式分组汇总和行式分组汇总,记录主条件就是判断出此个分组汇总是列式分组汇总还是行式分组汇总,列式分组汇总中,宾栏方向(列方向)为纯分组条件,格式为fz:(ti*qk tj*qv...)(tn tm ...),其中:ti*、tj*实现双方向分组,行式分组汇总中,主栏方向(行方向)为纯分组条件,格式为fz:(tn tm ...)(ti*qk tj*qv...),其中:ti*、tj*实现双方向分组,其中,(tn tm ...)就是条件组,(ti*qk tj*qv...)就是取数组,ti、tj、tn、tm就是条件分量,qk、qv就是取数分量;
[0129]

执行编译取数组中的取数标签,返回各种相关变量与状态值,并追加到线程代码供主程序调用;所有需要利用各线程并发完成的程序应该放在线程程序,主进程程序用于完成全局任务和调用线程程序;
[0130]

将总q的取数分量存入二维数组,其中,二维数组的第一维是“ ”分隔的段,二维数组的第二维是“*”分隔的段;语法规则中使用 和*号来分隔条件和取数。比如,列式分组汇总中fz:(ti*qk tj*qv...)(tn tm ...),左括号组中的内容用加号连接两个并列关系的取数qk和qv,qk还有附加条件ti并用*号分隔;右括号组中用加号连接并列关系的两个条件
[0131]

循环处理各个取数组,如果总q的某个分量的格式不是q*t格式,其中,q为取数标签,t为条件标签,那么将该个分量的格式转化为q*t格式后,再对q*t进行处理后,并将处理后的数据存入相关数组;存入数组是为了把规则中定义的标签和关系存入在数组中,在汇总程序执行时使用。
[0132]

执行编译汇总条件语句中的条件标签,返回各种相关变量与状态值,并追加到线程代码;
[0133]

线程代码增加各单位遍历循环代码,开始处理汇总名录表中的各单位的数据,汇总对所有单位只处理一次,满足条件的单位调取相关数据汇总即可;
[0134]

分解组合各汇总条件语句的段与层,
[0135]
如果汇总条件语句的段与层中包括t、*和q,那么某个汇总条件语句的某个分量便为t*q型,生成判断t*q中的t的真假的程序,其中,生成判断t*q中的t的真假的程序为判断t*q中的q是否满足t当中的条件,如果q满足t当中的条件,那么q参与后续的汇总;
[0136]
接着,如果发现汇总条件语句存在(t1 t2)格式,那么合并t1和t2中的条件内容,其中,t1,t2为汇总条件语句中的两个不同的条件标识;
[0137]

处理第一个汇总名录表中的单位时获取所有条件标签的长度,在执行汇总条件时获取t_group中的条件的个数;t_group是在sarp上的扩展,为了简化条件t定义,对于把整个分组作为汇总条件的情况,只要通过t_group指定那个分组编码就可以了,而不用把所有的分组值一一定义。比如,一个分组汇总任务是对所有行业对产品产值这个指标进行汇总,“行业代码”是个分组,其中有上千个行业,写分组汇总规则时,只要用t_group指定行业代码这个分组的编码即可,而不要在tn中逐条写上千个行业的编码。
[0138]

循环遍历所有条件组中的条件,如果某个条件组中的条件满足汇总条件语句中的分组条件,那么再循环遍历所有并汇总到相应的汇总表单元格,如果汇总条件语句中出现了“t_group”,那么遍历条件组的元素并汇总到相应的汇总表单元格,否则,汇总计数数量加1,其中,汇总计数数量的初始值为0;
[0139]
分组汇总的方式包括计数和求和,如果qn中定义的取数规则是a[0],则表示汇总方式是计数,表示满足条件的单位加算1个
[0140]
所述步骤s600中对表达式进行编译处理包括:
[0141]

判断表达式的类型,当表达式的类型为条件表达式时,通过分隔符将该条件表达式分隔成多个子表达式,转步骤


[0142]

生成每个子表达式的java申明程序;
[0143]

找出每个子表达式的操作符,并据此分辨出子表达式的左式和右式;
[0144]

顺着左式往右式的方向遍历每个子表达式的每个sarp关键字,每找到一个sarp关键字,将该个关键字转换成成相应的可供调用的java格式的执行代码和参数。
[0145]
表达式,是由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。
[0146]
通过一个java方法对审核、汇总中的汇前计算(ph)、汇总中的汇后计算(js)、汇总中的总条件(co)中出现的表达式,以及审核、汇总中的汇前计算(ph)、汇总中的汇后计算(js)中出现的判断条件(if)进行编译处理,将sarp规则转换成java程序。
[0147]
对常量、变量、操作符、函数、报表单元格等采用集中编译。从左向右遍历一个表达
式的每个字符,发现各种类型的关键字后,截取关键字及相关的参数等附属内容,根据其不种类型翻译成java代码。对于常量、变量、操作符可以直接转成对应的java程序;对于表报表单元格,需要将sarp规则的报表单元格语法转换成java数组格式,java使用double和string两个数组类型分别存放数值型和字符型报表数据,使用四维数组,第一维是报表、第二维是单位、第三维是行、第四维是列;对于函数,则要生成对应sarp函数功能的java函数,将sarp函数名和参数转换成java程序。
[0148]
所述步骤s600中每找到一个sarp关键字还包括:
[0149]
优先判断关键字的类型,
[0150]
当关键字为函数、变量、名录库属性、报表单元格中的一种;
[0151]
如果关键字为函数,从函数中分离出函数名和参数,分别转换成java的自定义函数和参数;
[0152]
如果关键字为变量,将变量转换成java自定义变量名称;
[0153]
如果关键字为名录库属性,将sarp的z格式或者z[p]格式转换成java的数组访问格式z[名录库索引][单位索引][属性坐标索引],其中,z表示名录库别名,p为自然数,p表示名录库中的单位属性的序号,
[0154]
如果关键字为报表单元格,其中,a表示报表别名,ad表示存放所有报表数据的多维数组变量名,
[0155]
当规则数组中sarp格式为“a[行序号,列序号]”,将其转换成java的数组访问格式“ad[报表索引][单位索引][单元格坐标索引]”,
[0156]
当规则数组中sarp格式为“a[行号,列序号]”,则要先将行号转换成索引号,再转换成java的数组访问格式“ad[报表索引][单位索引][单元格坐标索引]”;
[0157]
当规则数组中sarp格式为“a[母表行序号,母表列序号^子表行序号,子表列序号]”,将其转换成java的数组访问格式“ad[报表索引][单位索引][母表单元格坐标索引][子表单元格坐标索引]”,其中,在执行数据处理前初始化预处理时会把各报表表和名录库的行号对应的序号存储到java的容器变量中,产生映射对应关系;
[0158]
当关键字为除函数、变量、名录库属性、报表单元格以外的关键字,直接转换成对应的java格式的语句。
[0159]
一种基于sarp数据处理方法,所述数据处理方法包括数据处理任务调度运行方法,所述数据处理任务调度方法包括:
[0160]
预先查找当前处于空闲状态的m台中间件服务器,将各张报表的运算任务排队分配给这m台中间件服务器;比如开发主服务器的任务调度程序查找出当前空闲的5台中间件服务器资源,再将1000张报表的运算任务排队分配给这些服务器并发执行。对于报表间无数据关联的情况,这些报表可以并发同时运算。对于报表间有数据关联的情况,这些报表必须串行先后运算。
[0161]
当这m台中间件服务器接收到运算任务时,将运算任务分配给多个线程排队并发执行,所述运算任务包括报表运算、汇总单位运算和样本单位运算;
[0162]
如分配5个线程分别执行5张报表的运算,执行完成的线程再被分配其它报表运算,依次排队工作直到所有报表运算结束;如分配5个线程分别执行5个汇总单位,执行完成的线程再被分配其它汇总单位运算,依次排队工作直到这张报表所有的汇总单位运算结
束;如分配5个线程分别执行10000个样本单位的运算,执行完成的线程再被分配其它10000个样本单位运算,依次排队工作直到这张报表所有的样本单位运算结束,如是数据汇总则所有样本单位运算完成后再将每次汇总的小计数据再汇总。
[0163]
其中,当存在k张报表上的数据相互关联,先将k张报表之间串行后传输给中间件服务器进行运算。为了实现海量数据处理任务,如果采用单线程处理数据的效率非常低。单线程处理数据的算法无法充分发挥用户提供的多台中间件服务器资源(cpu、内存、硬盘)以及每台服务器提供的多枚cpu数据处理计算能力。java提供的多线程技术可以将多个计算任务分配给不同的线程并发运行,如果不采用多线程技术,一个java程序运行只能使用一核cpu线程,其它的cpu线程资源处于闲置状态。同时,处理海量数据也不能按一次性同时加载到空间有限的内存中的方法进行处理,否则会造成内存溢出错误,需要采取分批处理的算法。
[0164]
一种基于sarp数据处理规则编译方法的数据处理方法,所述数据处理方法包括数据处理运算方法,所述数据处理运算方法还包括:
[0165]
数据处理的基层样本单位存储在基层单位名录库中,名录库以关系型物理表的形式存储,单位属性字段可以由用户自定义。名录库中的基层单位填报各种报表,每张报表的各种相关数据存储在一张关系型物理表中。各名录库的单位之间存在一对一、一对多、多对多的关联关系。数据处理规则可以定义打开多个名录库,并可以定义各名录库之间的关联关系。每个名录库可以关联多张报表,每个名录库和每张报表均可以是任一时期的数据。
[0166]
采集基层单位数据时,系统将报表数据压缩成json格式,利用postgresql、人大金仓等关系型数据库或tbase、greenplum等mpp分布式数据库提供的二进制json字段(jsonb)存储,将每个样本单位的每张报表数据按键值(key

value)格式存储在一条记录的一个jsonb字段中。其中,键(key)是每张报表的每个单元格分配的全局唯一识别号(id),使用物理表存储单元格元素编码组合与id的映射关系,单元格元素包括指标、分组、目录等元数据,为了达到节约存储空间的目的,id号采用整型数字;值(value)是报表单元格数值,如果单元格是个子表类型,则value的类型是子表的键值。由于json是一种非结构化格式,可以实现有值的单元格才需要存储,可以压缩存储空间。数据库还为jsonb字段提供了键值级的增、删、改、查、索引、聚合分析、事务等功能,提高了数据操作、处理和分析的能力。
[0167]
由于采用多线程分配任务的运算方式,名录库和报表的数据并不是一次性全部取出,数据量大时如取出全部数据系统会产生内存溢出故障,因此每次取数量参数,分批取出当前主名录库的单位及其关联名录库的单位。
[0168]
所述数据处理任务调度运行方法还包括任务调度的响应机制,包括:
[0169]
根据服务器的硬件资源调节可用线程的数量;任务调度程序会定时获取服务器的cpu使用率、内存空闲空间等硬件资源,自动调节可用的线程数量;
[0170]
使得一定数量的硬件资源处于空闲状态,用于响应其他任务优先执行;一般需保留20%的余量用于响应其它小型任务优先执行,防止小型任务长时间等待大型任务完成释放资源后才能执行的不合理设计;
[0171]
监听到各服务器的各个线程,当某个线程完成任务后,会安排其它排队等候的任务到空闲资源继续执行,直到所有细分的子任务全部执行完成;
[0172]
监控每台服务器的资源占用情况动态增减线程数量;任务调度程序会监控每台服
务器的资源占用情况,及时动态增减线程数量,干预服务器的负载使用,避免出现服务器负载过高而出现无法响应的现象;
[0173]
动态分配给服务器的线程数小于等于预设阈值,每台服务器会有数百个线程同时进行整个任务的运算,动态分配的线程数一般最多可以占所有cpu核数(包括超线程cpu)的80%,剩余cpu资源备作它用。
[0174]
根据opz语法定义的打开一个或多个名录库语义,利用sql查询语句取出各名录库满足条件的基层单位及需要的属性值,数据存储在一个多维数组中。如果存在多个名录库关联,还要利用数组存储关联单位id的关联映射关系。
[0175]
根据op语法定义的打开一个或多张报表语义,利用sql查询语句取出名录库关联单位的报表数据,数值存储在一个多维数组中,数值型与字符型数值分别存在不同数据类型的数组中。此过程将压缩的json非结构化数据格式转换成结构化的数组数据格式,方便数据的定位、运算。
[0176]
审核语法包括实时审核、表内审核、表间审核、审核知识库。通过“$”等符号加上审核出错提示信息,标识出紧跟的一个计算表达式作为审核逻辑。执行时会判断如果计算表达式不满足则输出提示信息。提示信息是一段文字,中间可以嵌入表达式,输出时要将表达式计算成数值。
[0177]
计算语法包括ph填前一次计算、pha填前总是计算、js填后计算。用于标识一段计算规则执行的时机。在填报数据时,有的规则是在填报用户第一次打开报表时需要在填报前先行计算,有的规则是在用户每次打开报表时都要计算,有的规则是用户在保存数据后才需要执行计算。
[0178]
汇总语法包括ph汇前计算、js汇后计算、qn取数、tn分组条件取数、fz分组汇总、co总条件、sql方式汇总。汇总规则的执行,先打开基层表、内存表、汇总表;ph规则在执行汇总前对所有基层单位的数据遍历运行计算;js规则是在执行汇总后对汇总单位运行计算;qn规则是定义基本单位名录库和基层表的取数操作,可以定义多个取数条件;tn规则是定义分组汇总的条件,条件是基本单位名录库的属性;fz规则是定义取数和条件的交叉方式,对选取的基层单位样本数据按照单位属性条件求和就可以运算汇总数据;co规则是定义总的单位过滤条件,满足条件的基层单位才参加汇总;sql规则是将基层数据插入数据库内存表中执行sql语句处理数据,是数据汇总方式的一种补充。
[0179]
条件语句执行编译时将sarp条件规则转换成的java程序循环。条件中的计算表达式方式与非条件计算表达式处理方式相似。主要是增加了比较操作符,增加了等于操作不作赋值处理,增加了与、或、非的操作。
[0180]
执行编译时将sarp循环规则转换成的java程序循环。
[0181]
函数包括表操作函数、名录库操作函数、字符操作函数、数据操作函数、判断性函数。编译时已将sarp函数规则转换成的java程序自定义函数,运算时调用java函数程序。
[0182]
常变量包括常量、字符串变量、数值型变量、时间变量、对象变量、布尔变量。编译时已将sarp常变量转换成的java常变量,运算即可。
[0183]
关系式就是量与量之间的关系用式子表达,如a[1,1]=a[1,2] a[1,3]。关系式中的运算符包括算术运算符、关系运算符、逻辑运算符。编译时已将sarp中的报表别名表达式转换成了java程序中的数组变量,将sarp规则中的报表数据运算转换成了java程序对数组
数据的运算。
[0184]
描述单元包括一维描述法a[1]、二维描述法a[1,1]、三维描述法a[1,1^1,1]、分组标志z[1]、内存变量[1,1]。由于编译时已将sarp规则中的描述单元转换成了java的数组表达式和坐标,运算时java程序直接取数组值运算。坐标值如是变量表达式,运算时也会取变量值。
[0185]
sarp语法中对报表单元格的引用表达式是报表别名,别名编译时转换成的是java程序中的数组名。报表中的单元格有数值型、字符型、日期型等数据类型,但一个java数组变量只能申明为一种数据类型,并且sarp规则中的报表单元格表达式中的坐标可能还是变量。造成在编译时,无法识别出单元格的数据类型,所以在编译时要先作判断,数值型和字符型的单元格在执行时运行的java程序是不同的。为了用户方便,sarp语言不要求变量类型申明,在编译时要对可能的类型都作处理。
[0186]
报表数据取到内存数组变量,经过各种运算,再将数组数据生成json数据更新到数据库的jsonb字段中,完成报表数据的运算。
[0187]
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。
[0188]
最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

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

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

相关文献