一种计算业务指标的方法及装置
文献发布时间:2023-06-19 12:24:27
技术领域
本发明实施例涉及金融科技(Fintech)领域,尤其涉及一种计算业务指标的方法及装置。
背景技术
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。在金融领域,随着金融业务的不断更新变化,所涉及到的金融业务指标也会增多,如此为了确保金融服务质量,需要及时准确地将各金融业务指标的指标值计算出来。
现有方案是通过在sql脚本中预先定制某一金融业务所涉及的函数运算表达式来计算该金融业务中各业务指标的指标值。以计算某客户在某一段时间内的金融贷款利息为例,通过将计算金融贷款利息的表达式预先设置在sql查询脚本中,以此来构建出计算金融贷款利息的sql查询脚本,然后执行该sql查询脚本,即可得出该客户在这段时间内的金融贷款利息。然而,采用该现有方案若需要增加新的金融业务或增加新的业务指标,就需要重新开发该新的金融业务或新的业务指标所涉及的指标值计算代码,如此会导致开发人员的工作量增加,使得开发成本增加,并会导致业务指标的指标值的计算效率低。
综上,目前亟需一种计算业务指标的方法,用以实现业务指标的运算表达式的动态化配置,并使得sql数据运算脚本的执行更加灵活。
发明内容
本发明实施例提供了一种计算业务指标的方法及装置,用以实现业务指标的运算表达式的动态化配置,并使得sql数据运算脚本的执行更加灵活。
第一方面,本发明实施例提供了一种计算业务指标的方法,包括:
接收数据查询指令;所述数据查询指令用于根据业务数据获取业务指标的指标结果;
通过结构化查询语言sql数据运算脚本中配置的动态公式计算函数,从算法配置库中获取所述业务指标的运算表达式,以及从所述业务数据中获取所述运算表达式的各运算因子的业务值;所述算法配置库中存储有各业务指标的运算表达式的描述信息和各运算因子的描述信息;
通过所述动态公式计算函数调用运算表达式引擎工具包;
基于所述运算表达式和所述各运算因子的业务值,执行所述运算表达式引擎工具包,得到所述业务指标的指标结果。
上述技术方案中,在接收用于根据业务数据获取业务指标的指标结果的数据查询指令之后,通过sql数据运算脚本中配置的动态公式计算函数,可以自动从算法配置库中获取业务指标的运算表达式,以及自动从业务数据中获取运算表达式的各运算因子的业务值。再通过动态公式计算函数调用运算表达式引擎工具包,并基于运算表达式和各运算因子的业务值,执行运算表达式引擎工具包,即可及时准确地得到业务指标的指标结果。如此,该方案可通过调用动态公式计算函数来自动获取所需计算的业务指标的运算表达式,而无需预先设置固定的运算表达式在sql数据运算脚本中,从而可以实现业务指标的运算表达式的动态化配置,并能够使得sql数据运算脚本的执行更加灵活。此外,该方案即使需要增加新的运算表达式,也只需在算法配置库中配置新的运算表达式即可,然后通过sql数据运算脚本中的动态公式计算函数能够实现自动获取该新的运算表达式,而无需更改sql数据运算脚本,因此该方案可以降低开发人员的工作量,并可以提高业务指标的指标结果的计算效率。
可选地,在接收数据查询指令之前,还包括:
针对每个业务指标,为所述业务指标设置对应的运算表达式的描述信息及运算表达式的各运算因子的描述信息;
将各业务指标的运算表达式的描述信息及运算表达式的各运算因子的描述信息存储在所述算法配置库中。
上述技术方案中,通过预先为每个业务指标配置对应的运算表达式的描述信息及运算表达式的各运算因子的描述信息,可以便于后续sql数据运算脚本中的动态公式计算函数自动从算法配置库中获取相应业务指标的运算表达式,即使增加新的业务指标,也只需在算法配置库中配置新的业务指标对应的运算表达式的描述信息及运算表达式的各运算因子的描述信息即可实现后续动态公式计算函数的自动获取,而无需更改sql数据运算脚本,从而实现业务指标的运算表达式的动态化配置。
可选地,所述算法配置库包括算法描述表和算法属性表;所述算法描述表用于配置所述业务指标的类型、所述业务指标的运算表达式、所述业务指标的名称以及所述运算表达式的标识;所述算法属性表用于配置所述运算表达式的标识、所述运算表达式的各运算因子的名称以及所述运算表达式的各运算因子的数据类型;
所述方法还包括:
若增加新的业务指标,则在所述算法描述表中配置所述新的业务指标的类型、所述新的业务指标的运算表达式、所述新的业务指标的名称以及所述新的业务指标的运算表达式的标识,以及在所述算法属性表中配置所述新的业务指标的运算表达式的标识、所述新的业务指标的运算表达式的各运算因子的名称以及所述新的业务指标的运算表达式的各运算因子的数据类型。
上述技术方案中,如果增加新的业务指标,则该方案只需在算法描述表中配置新的业务指标的类型、新的业务指标的运算表达式、新的业务指标的名称以及新的业务指标的运算表达式的标识,以及在算法属性表中配置新的业务指标的运算表达式的标识、新的业务指标的运算表达式的各运算因子的名称以及新的业务指标的运算表达式的各运算因子的数据类型即可,然后sql数据运算脚本中的动态公式计算函数就可以自动从算法配置库中获取该新的业务指标对应的运算表达式,而无需更改sql数据运算脚本,从而实现业务指标的运算表达式的动态化配置。
可选地,在接收数据查询指令之前,还包括:
基于所述动态公式计算函数、所述算法配置库以及业务数据库,构建出用于确定业务指标的指标结果的sql数据运算脚本;所述业务数据库中存储有各业务指标的运算表达式的各运算因子的业务值。
上述技术方案中,在接收数据查询指令执行sql数据运算脚本之前,需要基于动态公式计算函数、算法配置库以及业务数据库预先编写好sql数据运算脚本,以便后续在接收到数据查询指令之后,可以及时有效地获取所需查询的业务指标的指标结果。
可选地,通过下述方式确定运算表达式引擎工具包:
定义用于确定业务指标对应的指标结果的类,并定义所述类的第一输入参数和第二输入参数;所述第一输入参数用于加载所述算法配置库中业务指标的运算表达式;所述第二输入参数用于加载业务数据中符合所述业务指标的运算表达式的各运算因子对应的业务值;
定义所述类的输出参数,并定义所述类所涉及的计算方法;
将所述类的第一输入参数、第二输入参数、输出参数以及计算方法打包为所述运算表达式引擎工具包。
上述技术方案中,通过将类的第一输入参数、第二输入参数、输出参数以及计算方法打包为运算表达式引擎工具包,可以便于在执行sql数据运算脚本时,该sql数据运算脚本中的动态公式计算函数能够及时有效地调用运算表达式引擎工具包,从而可以动态化地获取所需查询的业务指标的运算表达式,并基于该运算表达式及时准确地计算出该业务指标的指标结果。
可选地,在从所述业务数据中获取所述运算表达式的各运算因子的业务值之后,还包括:
对所述运算表达式的各运算因子的业务值进行校验,确定所述运算表达式的各运算因子的业务值的数据格式是否符合第二输入参数对应的数据格式要求;
若否,则将所述运算表达式的各运算因子的业务值转换为符合所述第二输入参数对应的数据格式要求的业务值。
上述技术方案中,在将从业务数据中获取的运算表达式的各运算因子的业务值传入到动态公式计算函数中之前,需要对该运算表达式的各运算因子的业务值进行校验,以确定该运算表达式的各运算因子的业务值是否第二输入参数对应的数据格式要求,如此可以避免因该运算表达式的各运算因子的业务值的数据格式不符合动态公式计算函数的数据格式要求而导致计算异常,并可以确保后续计算业务指标的指标结果的准确性。
可选地,所述动态公式计算函数是在Hive中构建的临时函数;所述运算表达式引擎工具包是基于Java数据格式构建的;
在得到所述业务指标的指标结果之后,还包括:
将Java数据格式的指标结果转换为符合所述Hive的数据格式要求的指标结果。
上述技术方案中,通过将Java数据格式的指标结果转换为符合Hive的数据格式要求的指标结果,可以便于后续Hive库针对该指标结果进行处理。
第二方面,本发明实施例还提供了一种计算业务指标的装置,包括:
接收单元,用于接收数据查询指令;所述数据查询指令用于根据业务数据获取业务指标的指标结果;
处理单元,用于通过结构化查询语言sql数据运算脚本中配置的动态公式计算函数,从算法配置库中获取所述业务指标的运算表达式,以及从所述业务数据中获取所述运算表达式的各运算因子的业务值;所述算法配置库中存储有各业务指标的运算表达式的描述信息和各运算因子的描述信息;通过所述动态公式计算函数调用运算表达式引擎工具包;基于所述运算表达式和所述各运算因子的业务值,执行所述运算表达式引擎工具包,得到所述业务指标的指标结果。
可选地,所述处理单元还用于:
在接收数据查询指令之前,针对每个业务指标,为所述业务指标设置对应的运算表达式的描述信息及运算表达式的各运算因子的描述信息;
将各业务指标的运算表达式的描述信息及运算表达式的各运算因子的描述信息存储在所述算法配置库中。
可选地,所述算法配置库包括算法描述表和算法属性表;所述算法描述表用于配置所述业务指标的类型、所述业务指标的运算表达式、所述业务指标的名称以及所述运算表达式的标识;所述算法属性表用于配置所述运算表达式的标识、所述运算表达式的各运算因子的名称以及所述运算表达式的各运算因子的数据类型;
所述处理单元还用于:
若增加新的业务指标,则在所述算法描述表中配置所述新的业务指标的类型、所述新的业务指标的运算表达式、所述新的业务指标的名称以及所述新的业务指标的运算表达式的标识,以及在所述算法属性表中配置所述新的业务指标的运算表达式的标识、所述新的业务指标的运算表达式的各运算因子的名称以及所述新的业务指标的运算表达式的各运算因子的数据类型。
可选地,所述处理单元还用于:
在接收数据查询指令之前,基于所述动态公式计算函数、所述算法配置库以及业务数据库,构建出用于确定业务指标的指标结果的sql数据运算脚本;所述业务数据库中存储有各业务指标的运算表达式的各运算因子的业务值。
可选地,所述处理单元具体用于:
定义用于确定业务指标对应的指标结果的类,并定义所述类的第一输入参数和第二输入参数;所述第一输入参数用于加载所述算法配置库中业务指标的运算表达式;所述第二输入参数用于加载业务数据中符合所述业务指标的运算表达式的各运算因子对应的业务值;
定义所述类的输出参数,并定义所述类所涉及的计算方法;
将所述类的第一输入参数、第二输入参数、输出参数以及计算方法打包为所述运算表达式引擎工具包。
可选地,所述处理单元还用于:
在从所述业务数据中获取所述运算表达式的各运算因子的业务值之后,对所述运算表达式的各运算因子的业务值进行校验,确定所述运算表达式的各运算因子的业务值的数据格式是否符合第二输入参数对应的数据格式要求;
若否,则将所述运算表达式的各运算因子的业务值转换为符合所述第二输入参数对应的数据格式要求的业务值。
可选地,所述动态公式计算函数是在Hive中构建的临时函数;所述运算表达式引擎工具包是基于Java数据格式构建的;
所述处理单元还用于:
在得到所述业务指标的指标结果之后,将Java数据格式的指标结果转换为符合所述Hive的数据格式要求的指标结果。
第三方面,本发明实施例提供一种计算设备,包括至少一个处理器以及至少一个存储器,其中,所述存储器存储有计算机程序,当所述程序被所述处理器执行时,使得所述处理器执行上述第一方面任意所述的计算业务指标的方法。
第四方面,本发明实施例提供一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述第一方面任意所述的计算业务指标的方法。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种计算业务指标的方法的流程示意图;
图2为本发明实施例提供的一种计算业务指标的装置的结构示意图;
图3为本发明实施例提供的一种计算设备的结构示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
下面首先对本发明实施例中涉及的部分用语进行解释说明,以便于本领域技术人员进行理解。
(1)UDF函数:User Defined Function,用户自定义函数。以Hive库为例,Hive库自带了一些函数,比如max/min等,但是由于Hive库自带的函数范围有限,用户自己可以定义UDF来方便扩展。
(2)JEXL:Java Expression Language,是一个表达式语言引擎,可以用来在应用或者框架中使用,比如可以配合Java程序运算一些复杂场景的表达式。
如上介绍了本发明实施例中涉及的部分用语,下面对本发明实施例涉及的技术特征进行介绍。
图1示例性的示出了本发明实施例提供的一种计算业务指标的方法的流程,该流程可以由计算业务指标的装置执行。
如图1所示,该流程具体包括:
步骤101,接收数据查询指令。
步骤102,通过结构化查询语言sql数据运算脚本中配置的动态公式计算函数,从算法配置库中获取所述业务指标的运算表达式,以及从所述业务数据中获取所述运算表达式的各运算因子的业务值。
步骤103,通过所述动态公式计算函数调用运算表达式引擎工具包。
步骤104,基于所述运算表达式和所述各运算因子的业务值,执行所述运算表达式引擎工具包,得到所述业务指标的指标结果。
上述步骤101中,在用户需要查询某一业务指标或某几个业务指标的指标结果时,可以发送数据查询指令给sql数据查询脚本,该数据查询指令中可以包括业务指标名称和业务指标名称对应的运算表达式标识。
示例性地,假设用户想要查询某一贷款业务的贷款利息,则可以发送贷款利息查询指令给sql数据查询脚本,该贷款利息查询指令包括贷款利息名称以及贷款利息名称对应的运算表达式。
此外,在接收数据查询指令之前,针对每个业务指标,为该业务指标设置对应的运算表达式的描述信息及运算表达式的各运算因子的描述信息,并将各业务指标的运算表达式的描述信息及运算表达式的各运算因子的描述信息存储在所述算法配置库中。具体地,算法配置库包括算法描述表和算法属性表。其中,算法描述表用于配置业务指标的类型、业务指标的运算表达式、业务指标的名称以及运算表达式的标识;算法属性表用于配置所述运算表达式的标识、运算表达式的各运算因子的名称以及运算表达式的各运算因子的数据类型。通过预先为每个业务指标配置对应的运算表达式的描述信息及运算表达式的各运算因子的描述信息,可以便于后续sql数据运算脚本中的动态公式计算函数自动从算法配置库中获取相应业务指标的运算表达式,即使增加新的业务指标,也只需在算法配置库中配置新的业务指标对应的运算表达式的描述信息及运算表达式的各运算因子的描述信息即可实现后续动态公式计算函数的自动获取,而无需更改sql数据运算脚本,从而实现业务指标的运算表达式的动态化配置。
如果需要增加新的业务指标,则在算法描述表中配置新的业务指标的类型、新的业务指标的运算表达式、新的业务指标的名称以及新的业务指标的运算表达式的标识,以及在算法属性表中配置新的业务指标的运算表达式的标识、新的业务指标的运算表达式的各运算因子的名称以及新的业务指标的运算表达式的各运算因子的数据类型即可,然后sql数据运算脚本中的动态公式计算函数就可以自动从算法配置库中获取该新的业务指标对应的运算表达式,而无需更改sql数据运算脚本。
再者,在接收数据查询指令执行sql数据运算脚本之前,需要基于动态公式计算函数、算法配置库以及业务数据库预先编写好sql数据运算脚本,以便后续在接收到数据查询指令之后,可以及时有效地获取所需查询的业务指标的指标结果。其中,业务数据库中存储有各业务指标的运算表达式的各运算因子的业务值。
上述步骤102和步骤103中,在获取到业务指标名称和业务指标名称对应的运算表达式标识后,通过sql数据运算脚本中配置的动态公式计算函数,从算法配置库中获取与业务指标名称对应的运算表达式,以及从业务数据中获取该运算表达式所包含的各运算因子的业务值。再通过动态公式计算函数调用运算表达式引擎工具包。其中,在从业务数据中获取运算表达式的各运算因子的业务值之后,需要对运算表达式的各运算因子的业务值进行校验,确定运算表达式的各运算因子的业务值的数据格式是否符合第二输入参数对应的数据格式要求。若是,则将该运算表达式的各运算因子的业务值直接传入到动态公式计算函数中;若否,则将运算表达式的各运算因子的业务值转换为符合第二输入参数对应的数据格式要求的业务值,然后将符合第二输入参数对应的数据格式要求的业务值传入到动态公式计算函数中。如此,可以避免因该运算表达式的各运算因子的业务值的数据格式不符合动态公式计算函数的数据格式要求而导致计算异常,并可以确保后续计算业务指标的指标结果的准确性。
此外,可通过下述方式确定运算表达式引擎工具包:首先定义用于确定业务指标对应的指标结果的类,并定义类的第一输入参数和第二输入参数。再定义类的输出参数,并定义类所涉及的计算方法。然后将类的第一输入参数、第二输入参数、输出参数以及计算方法打包为运算表达式引擎工具包。如此,可以便于在执行sql数据运算脚本时,该sql数据运算脚本中的动态公式计算函数能够及时有效地调用运算表达式引擎工具包,从而可以动态化地获取所需查询的业务指标的运算表达式,并基于该运算表达式及时准确地计算出该业务指标的指标结果。其中,第一输入参数用于加载算法配置库中业务指标的运算表达式;第二输入参数用于加载业务数据中符合业务指标的运算表达式的各运算因子对应的业务值。
示例性地,假设有两个业务指标,即业务指标A和业务指标B,现有技术在计算业务指标A的指标结果、业务指标B的指标结果时,需要在sql数据运算脚本中预先定制业务指标A对应的计算公式以及业务指标B对应的计算公式,比如业务指标A对应的sql数据运算脚本为select A*f1*f2 as FeeAfrom table1;业务指标B对应的sql数据运算脚本为select B*f1*f2 as FeeB from table1。而本方案无需预在sql数据运算脚本中预先定制业务指标A对应的计算公式以及业务指标B对应的计算公式,需要在算法配置库中配置业务指标A的计算公式的描述信息及业务指标A的计算公式的各运算因子的描述信息,以及在算法配置库中配置业务指标B的计算公式的描述信息及业务指标B的计算公式的各运算因子的描述信息。同时也会创建一个类,比如CalcFeeOnFeeType类,并定义CalcFeeOnFeeType类的输入参数、输出参数以及所涉及的计算方法,比如evaluate计算方法。然后将CalcFeeOnFeeType类以及完整项目整体打包为类工具包。然后,在Hive库中创建临时函数calcfee,该临时函数calcfee作为动态公式计算函数,用于调用类工具包。其中,该动态公式计算函数可以动态统一调用业务指标A对应的计算公式以及业务指标B对应的计算公式,比如动态统一调用的sql数据运算脚本为select calcfee(FA,map1)as FeeA,calcfee(FB,map1)as FeeB fromtable1。如此,通过临时函数calcfee()即可计算出相应业务指标的指标结果。
上述步骤104中,基于运算表达式和各运算因子的业务值,执行运算表达式引擎工具包,即可得到业务指标的指标结果。由于动态公式计算函数是在Hive中构建的临时函数,以及运算表达式引擎工具包是基于Java数据格式构建的,因此在得到业务指标的指标结果后,需要将Java数据格式的指标结果转换为符合Hive的数据格式要求的指标结果,如此可以便于后续Hive库针对该指标结果进行处理。
基于此,下面以Hive库中涉及的sql数据运算脚本为例,对本发明实施例中计算业务指标的方法的实施过程进行具体描述。
Step1:定义算法配置表以及算法属性表。
本发明实施例中,为了实现在数据库中编写的sql数据运算脚本能够动态化获取配置好的运算表达式,需要提前预先配置好各运算表达式,即提前预先定义好算法配置表TM_CBS_CALCULATE以及算法属性表TM_CBS_CALC_PROPERTY,并在算法配置表TM_CBS_CALCULATE中配置对应的配置信息,以及在算法属性表TM_CBS_CALC_PROPERTY中配置对应的配置信息。示例性地,针对某一业务场景的金融产品,比如贷款业务或保险业务等的金融产品,若对该金融产品做结算处理,比如针对该金融产品的交易信息做结算处理,或者可以针对某一金融产品的订单信息做结算处理,或者针对某一金融产品的借据信息做结算处理等,此时就需要计算该金融产品所涉及的各项业务指标所关联的数据进行计算,比如可以定义一个UDF函数,并在Hive库中创建一个临时函数,并将该临时函数构建在该金融产品对应的sql数据运算脚本中,该临时函数可以用于调用UDF函数,来动态获取算法配置表中的相关运算表达式,如此能够及时地计算出各项业务指标的指标结果,而无需在sql数据运算脚本提前定制化与各项业务指标相关的运算表达式,也就可以使得sql数据运算脚本的执行更加灵活。
其中,算法配置表TM_CBS_CALCULATE的形式可以如表1所示。
表1
算法属性表TM_CBS_CALC_PROPERTY的形式可以如表2所示。
表2
示例性地,以贷款本金渠道费为例对定义算法配置表以及算法属性表进行描述。
针对Loan_Prin_Amt(贷款本金渠道费),如果贷款结清日期Paidoutdate与贷款放款日期Registerdate之间的差值超过预设间隔天数Nday,就返回结清的贷款本金渠道费金额,该结清的贷款本金渠道费金额Clear_Amt=折扣率Dis_Rate*贷款本金Loan_Amt*渠道费率Fee_Rate;如果贷款结清日期Paidoutdate与贷款放款日期Registerdate之间的差值超过预设间隔天数Nday小于等于预设间隔天数Nday,就返回结清的贷款本金渠道费金额,该结清的贷款本金渠道费金额Clear_Amt=贷款本金Loan_Amt*渠道费率Fee_Rate。
其中,贷款本金渠道费Loan_Prin_Amt的算法配置表可以如表3所示。
表3
贷款本金渠道费Loan_Prin_Amt的运算表达式的属性表可以如表4所示。
表4
Step2:定义UDF函数,并基于该定义的UDF函数调用JEXL表达式来实现动态计算功能。
本发明实施例中,在基于定义的UDF函数调用JEXL表达式之前,首先在Maven仓库中添加JEXL,以便实现该定义的UDF函数调用JEXL表达式。需要说明的是,本发明实施例除了可以使用JEXL表达式,也可以使用其他表达式,比如fel表达式、El表达式、aviator表达式等,本发明实施例对此并不作限定。
示例性地,在Maven仓库中添加JEXL依赖的执行代码可以为:
在Maven仓库中添加JEXL依赖之后,本发明实施例定义实现UDF函数功能的类,并针对该实现UDF函数的类的输入参数和输出参数进行定义。具体地,定义一个CalcFeeOnFeeType类,该CalcFeeOnFeeType类用于实现UDF函数,而且该CalcFeeOnFeeType类需要继承GenericUDF类。同时在该CalcFeeOnFeeType类中定义一个初始化initialize方法,用以对该CalcFeeOnFeeType类的输入参数进行校验。
其中,针对该CalcFeeOnFeeType类,定义两个输入参数,即第一输入参数和第二输入参数。其中,第一输入参数为字符串expressionStr,该第一输入参数用于加载算法配置表中某一业务场景中某一业务指标对应的运算表达式;第二输入参数为字符串inParaMap,该第二输入参数用于加载某一业务场景中某一业务指标对应的业务数据,也即是说,在计算某一业务场景中某一业务指标的指标结果时,该第二输入参数所传入的是由该业务指标对应的运算表达式中所需要的计算因子组成的map,在运行时由业务数据提供。此外,针对该CalcFeeOnFeeType类,也会定义一个输出参数,比如可以定义该输出参数的类型为BigDecimal类型。
此外,针对该CalcFeeOnFeeType类,定义该CalcFeeOnFeeType类中的逻辑运算方法,也即是实现该CalcFeeOnFeeType类的evaluate计算方法。其中,该evaluate计算方法包括三个部分,即,(1)提取第一输入参数expressionStr和第二输入参数inParaMap,(2)调用计算服务,也即是利用jexl包实现动态计算功能,即jexlEvaluate.Evaluate(expressionStr,inParaMap),(3)将利用jexl包所计算出的数据结果的数据类型转换为Hive可以处理的数据类型。
在定义好CalcFeeOnFeeType类后,将CalcFeeOnFeeType类以及完整项目整体打包为类工具包,比如bdp-udf-cbs1.2.jar。
此外,利用jexl包实现动态计算功能的具体过程为:
步骤a、创建jexl表达式计算引擎,并加载扩展的自定义函数到该jexl表达式计算引擎中。
其中,可以定义任一任务场景所需的任何函数库,以实现Hive库的函数(比如运算表达式)扩展,并将扩展的函数加入到jexl表达式计算引擎中。
步骤b、通过第一输入参数expressionStr,创建一个将要执行的计算表达式。
其中,该将要执行的计算表达式可以支持扩展的自定义运算表达式。示例性地,通过第一输入参数,创建一个将要执行的计算表达式的执行脚本可以为JexlExpression e=jexl.createExpression(formula)。以计算贷款本金渠道费为例,该formula可以表示为:
步骤c、通过第二输入参数inParaMap,加载计算表达式执行时所需的业务数据,并将该业务数据压入到jexl表达式计算引擎中。
示例性地,通过第二输入参数,加载计算表达式执行时所需的业务数据的执行脚本可以为:
步骤d、执行计算表达式,返回结果。
示例性地,以计算贷款本金渠道费为例,假设贷款结清日期Paidoutdate与贷款放款日期Registerdate之间的差值超过预设间隔天数(Nday=30),执行计算贷款本金渠道费的表达式,返回结果(即贷款本金渠道费)=1*500*0.05=25。
Step3:通过Hive库中编写好的sql数据运算脚本调用UDF函数,计算任一业务指标的指标结果。
在执行Hive库中编写好的sql数据运算脚本之前,加载执行自定义开发的类工具包,并加载该类工具包对应的类方法信息。再在Hive库中创建临时函数calcfee,该临时函数calcfee作为动态公式计算函数,用于动态调用类工具包对应的类方法,以此实现针对任一业务指标的指标结果的计算。如此,在执行sql数据运算脚本时,可调用此临时函数进行计算任一业务指标的指标结果。
在Hive库中创建临时函数calcfee的脚本可以为:
add jar viewfs:///apps-data/cnc-common/cnc_udf/bdp-udf-cbs1.2.jar;
create temporary function calcfee as“cn.xxxx.cnc.bdp.udf.cbs.feeCalc.impl.CalcFeeOnFeeType”;
在创建好临时函数calcfee后,预先编写好通用的sql框架,构建入参,然后通过select calcfee()调用UDF函数,即可获取任一业务指标的指标结果,如此,该方案无需在sql数据运算脚本中预先定制运算表达式,即可根据算法配置表TM_CBS_CALCULATE中的配置信息,动态获取相应的运算表达式,并将该相应的运算表达式传入到参数列表,以此实现动态计算某一个或某几个业务指标的指标结果。
假设有三个业务指标,即业务指标A、业务指标B和业务指标C。分别配置业务指标A对应的运算表达式为F(A),业务指标B对应的运算表达式为F(B),业务指标C对应的运算表达式为F(C)。如果以现有技术方案来进行计算这三个业务指标的指标结果,则编写的计算这三个业务指标的指标结果的sql数据运算脚本为:
Select loan_id,
F(A)as A,
F(B)as B,
F(C)as C,
From TM_LOAN;
然而,如果需要新增业务指标,比如新增业务指标D,要想计算出该新增业务指标D的指标结果,必须修改sql数据运算脚本,同时通过重新开发才能实现计算该新增业务指标D的指标结果,但是修改sql数据运算脚本也可能会影响到计算业务指标A、业务指标B以及业务指标C的指标结果。
如果采用本发明的方案,则是在算法配置表TM_CBS_CALCULATE中预先配置业务指标A、业务指标B以及业务指标C对应的运算表达式,即配置A=F(A),B=F(B),C=F(C),如此可通过编写好的sql数据运算脚本中的临时函数calcfee()即可自动获取F(A)、F(B)以及F(C),而不是预先在sql数据运算脚本中设置F(A)、F(B)以及F(C)。如果需要新增业务指标,比如新增业务指标D,只需在算法配置表TM_CBS_CALCULATE中配置新增业务指标D对应的运算表达式,即配置D=F(D),即可实现通过配置化动态获取新增业务指标D的指标结果,而无需修改编写好的sql数据运算脚本。
以计算贷款本金渠道费为例,在Hive库中所编写的用于得到贷款本金渠道费的sql数据运算脚本为:
Select l.loan_id,c,formula,
calcfee(c.formula,map(“Nday”,l.Nday,
“Paidoutdate”,l.Paidoutdate,
“Registerdate”,l.Registerdate,
“Fee_Rate”,l.Fee_Rate,
“Loan_Amt”,l.Loan_Amt)
)as calcAmt
From TM_CBS_CALCULATE c
join TM_LOAN l
on c.product_id=l.product_id
where c.id=”xx”;
在接收到用户的查询贷款本金渠道费的指令之后,基于计算贷款本金渠道费的运算表达式标识,从算法配置表TM_CBS_CALCULATE中获取到对应的运算表达式,并从贷款本金渠道费对应的业务数据库TM_LOAN中获取与该运算表达式匹配的业务数据,也即是获取与该运算表达式的属性表中各属性匹配的业务数据,然后将该运算表达式以及该业务数据传入到临时函数calcfee中,并通过临时函数calcfee调用类工具包,基于该运算表达式以及该业务数据,执行类工具包,即可计算出贷款本金渠道费。
上述实施例表明,在接收用于根据业务数据获取业务指标的指标结果的数据查询指令之后,通过sql数据运算脚本中配置的动态公式计算函数,可以自动从算法配置库中获取业务指标的运算表达式,以及自动从业务数据中获取运算表达式的各运算因子的业务值。再通过动态公式计算函数调用运算表达式引擎工具包,并基于运算表达式和各运算因子的业务值,执行运算表达式引擎工具包,即可及时准确地得到业务指标的指标结果。如此,该方案可通过调用动态公式计算函数来自动获取所需计算的业务指标的运算表达式,而无需预先设置固定的运算表达式在sql数据运算脚本中,从而可以实现业务指标的运算表达式的动态化配置,并能够使得sql数据运算脚本的执行更加灵活。此外,该方案即使需要增加新的运算表达式,也只需在算法配置库中配置新的运算表达式即可,然后通过sql数据运算脚本中的动态公式计算函数能够实现自动获取该新的运算表达式,而无需更改sql数据运算脚本,因此该方案可以降低开发人员的工作量,并可以提高业务指标的指标结果的计算效率。
基于相同的技术构思,图2示例性的示出了本发明实施例提供的一种计算业务指标的装置,该装置可以执行计算业务指标的方法的流程。
如图2所示,该装置包括:
接收单元201,用于接收数据查询指令;所述数据查询指令用于根据业务数据获取业务指标的指标结果;
处理单元202,用于通过结构化查询语言sql数据运算脚本中配置的动态公式计算函数,从算法配置库中获取所述业务指标的运算表达式,以及从所述业务数据中获取所述运算表达式的各运算因子的业务值;所述算法配置库中存储有各业务指标的运算表达式的描述信息和各运算因子的描述信息;通过所述动态公式计算函数调用运算表达式引擎工具包;基于所述运算表达式和所述各运算因子的业务值,执行所述运算表达式引擎工具包,得到所述业务指标的指标结果。
可选地,所述处理单元202还用于:
在接收数据查询指令之前,针对每个业务指标,为所述业务指标设置对应的运算表达式的描述信息及运算表达式的各运算因子的描述信息;
将各业务指标的运算表达式的描述信息及运算表达式的各运算因子的描述信息存储在所述算法配置库中。
可选地,所述算法配置库包括算法描述表和算法属性表;所述算法描述表用于配置所述业务指标的类型、所述业务指标的运算表达式、所述业务指标的名称以及所述运算表达式的标识;所述算法属性表用于配置所述运算表达式的标识、所述运算表达式的各运算因子的名称以及所述运算表达式的各运算因子的数据类型;
所述处理单元202还用于:
若增加新的业务指标,则在所述算法描述表中配置所述新的业务指标的类型、所述新的业务指标的运算表达式、所述新的业务指标的名称以及所述新的业务指标的运算表达式的标识,以及在所述算法属性表中配置所述新的业务指标的运算表达式的标识、所述新的业务指标的运算表达式的各运算因子的名称以及所述新的业务指标的运算表达式的各运算因子的数据类型。
可选地,所述处理单元202还用于:
在接收数据查询指令之前,基于所述动态公式计算函数、所述算法配置库以及业务数据库,构建出用于确定业务指标的指标结果的sql数据运算脚本;所述业务数据库中存储有各业务指标的运算表达式的各运算因子的业务值。
可选地,所述处理单元202具体用于:
定义用于确定业务指标对应的指标结果的类,并定义所述类的第一输入参数和第二输入参数;所述第一输入参数用于加载所述算法配置库中业务指标的运算表达式;所述第二输入参数用于加载业务数据中符合所述业务指标的运算表达式的各运算因子对应的业务值;
定义所述类的输出参数,并定义所述类所涉及的计算方法;
将所述类的第一输入参数、第二输入参数、输出参数以及计算方法打包为所述运算表达式引擎工具包。
可选地,所述处理单元202还用于:
在从所述业务数据中获取所述运算表达式的各运算因子的业务值之后,对所述运算表达式的各运算因子的业务值进行校验,确定所述运算表达式的各运算因子的业务值的数据格式是否符合第二输入参数对应的数据格式要求;
若否,则将所述运算表达式的各运算因子的业务值转换为符合所述第二输入参数对应的数据格式要求的业务值。
可选地,所述动态公式计算函数是在Hive中构建的临时函数;所述运算表达式引擎工具包是基于Java数据格式构建的;
所述处理单元202还用于:
在得到所述业务指标的指标结果之后,将Java数据格式的指标结果转换为符合所述Hive的数据格式要求的指标结果。
基于相同的技术构思,本发明实施例还提供了一种计算设备,如图3所示,包括至少一个处理器301,以及与至少一个处理器连接的存储器302,本发明实施例中不限定处理器301与存储器302之间的具体连接介质,图3中处理器301和存储器302之间通过总线连接为例。总线可以分为地址总线、数据总线、控制总线等。
在本发明实施例中,存储器302存储有可被至少一个处理器301执行的指令,至少一个处理器301通过执行存储器302存储的指令,可以执行前述的计算业务指标的方法中所包括的步骤。
其中,处理器301是计算设备的控制中心,可以利用各种接口和线路连接计算设备的各个部分,通过运行或执行存储在存储器302内的指令以及调用存储在存储器302内的数据,从而实现数据处理。可选的,处理器301可包括一个或多个处理单元,处理器301可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理下发指令。可以理解的是,上述调制解调处理器也可以不集成到处理器301中。在一些实施例中,处理器301和存储器302可以在同一芯片上实现,在一些实施例中,它们也可以在独立的芯片上分别实现。
处理器301可以是通用处理器,例如中央处理器(CPU)、数字信号处理器、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本发明实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合计算业务指标的方法实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器302作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。存储器302可以包括至少一种类型的存储介质,例如可以包括闪存、硬盘、多媒体卡、卡型存储器、随机访问存储器(Random AccessMemory,RAM)、静态随机访问存储器(Static Random Access Memory,SRAM)、可编程只读存储器(Programmable Read Only Memory,PROM)、只读存储器(Read Only Memory,ROM)、带电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、磁性存储器、磁盘、光盘等等。存储器302是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本发明实施例中的存储器302还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。
基于相同的技术构思,本发明实施例还提供了一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述计算业务指标的方法的步骤。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
- 业务指标分层计算方法及装置、分布式计算方法及系统
- 业务质量指标的计算方法、计算装置以及通信系统