利用ABAP 740的新关键字REDUCE完成一个实际工作任务

简介: 利用ABAP 740的新关键字REDUCE完成一个实际工作任务

ABAP 740从2013年发布至今已经过去很长的时间了,下面这张图来自SAP社区博客:


ABAP News for Release 7.40 – What is ABAP 7.40?


image.png

图中的ABAP 8.0, 即现在的SAP Cloud for Customer和Business By Design后台使用的ABAP版本NGAP - Next Generation ABAP Platform,里面存在不少只在8.0版本可用的关键字和语言特性。


因为C4C和BYD的ABAP后台,客户和partners们是无法访问的,所以咱们回到ABAP 740这个版本。从该版本开始,ABAP支持了很多新的关键字和语法特性,“看起来有点不像传统的ABAP编程语言了”。


本文咱们就来看一个具体的例子:ABAP 740里的一个新关键字REDUCE. 这个关键字的作用和在大规模数据集并行计算领域里广泛使用的"Map-Reduce"编程模型中的Reduce操作类似,可以按照字面意思理解为“归约”。


下图是Map Reduce框架的工作步骤,统计一个海量输入数据集(比如大于1TB)中的单词出现次数。作为ABAP开发人员,我们没必要了解Map Reduce框架的每个执行步骤,只需紧盯框架的输入,以及执行结果就行了。

image.png


回到Jerry接受的实际工作任务。德国同事让Jerry在某个CRM测试系统上做个统计,列出在数据库表CRM_JSTO里,OBTYP(Object Type)和STSMA(Status Schema)这两列拥有相同值的内表行的个数。大家可以把"OBTYP和STSMA两列具有相同值的内表行"类比成上图中重复出现的单词。


下图是CRM_JSTO的部分行:


image.png

下图是Jerry完成的任务: 测试系统上内表一共有55多万行,其中有90279行,只维护了OBTYP为TGP,而没有维护STSMA. 排名第二的是COH和CRMLEAD的组合,出现了78722次。


image.png

稍稍做过一些ABAP开发的朋友们,一定会立即写出下面的代码:


image.png

利用SELECT COUNT直接在数据库层完成统计工作。这也是SAP推荐的做法,所谓Code pusudown准则,即能放到HANA数据库层面进行的操作,就尽量放进去,以充分利用HANA强大的计算能力。在数据库能够完成计算逻辑的前提下,尽量避免把计算逻辑放到Netweaver ABAP应用层去做。


image.png

不过,我们也需要注意到这种方式的局限性。Jerry之前曾经引用过SAP CTO的名言:


There is no future with ABAP alone

There is no future in SAP without ABAP

image.png

未来的ABAP会走向开放,互联的道路。回到这个需求本身,假设待检索的输入数据不是从ABAP数据库表中来,而是来自HTTP请求,或者第三方系统发过来的IDOC,此时我们无法再使用OPEN SQL本身的SELECT COUNT操作,而只能在ABAP应用层解决这个问题。


所谓技多不压身,Jerry这里介绍两种用ABAP完成这个需求的方式。


第一种方式比较传统,实现在方法get_result_traditional_way里:


image.png

ABAP的LOOP AT GROUP BY这个关键字组合简直就像是为这个需求量身定做一般:给GROUP BY指定obtyp和stsma这两列,然后LOOP AT会自动将输入内表的行记录根据这两列的值进行分组,每组行记录的个数通过关键字GROUP SIZE自动计算出来,每组各自的obtyp和stsma的值,以及组内行记录的条目数,存储在REFERENCE INTO指定的变量group_ref里。ABAP顾问需要做的事情,只是简单地把这些结果存储到输出内表即可。

image.png


第二种办法,就是本文标题所述,使用ABAP 740新的REDUCE关键字:

image.png


上面的代码乍一看可能觉得有点晦涩,但仔细阅读后发现这种方式本质上也采用了和方法一LOOP AT GROUP BY同样的分组策略——根据obtyp和stsma分组,这些子组通过变量标识,然后通过第10行的REDUCE关键字,通过累加的方式,手动计算这个组的条目数——把一个大的输入集根据GROUP BY指定的条件归约成一个个规模更小的子集,然后分别针对子集进行计算——这就是REDUCE关键字通过字面含义传递给ABAP开发人员的处理思想。


总结和比较一下这三种实现方式:当待统计的数据源为ABAP数据库表时,一定优先选用OPEN SQL的方式,使计算逻辑在数据库层完成,以获得最佳的性能。


当数据源并非ABAP数据库表,而分组统计的需求为简单的计数操作(COUNT)时, 优先用LOOP AT … GROUP BY … GROUP SIZE,使得计数操作通过GROUP SIZE在ABAP kernel完成,以获得较好的性能。


当数据源并非ABAP数据库表,而分组统计的需求为自定义的逻辑时,用本文介绍的第三种REDUCE解法,将自定义统计逻辑写在第11行的NEXT关键字后。


这三种解法的性能依次递减,不过适用的场合和灵活程度依次递增。


LOOP AT … GROUP BY … GROUP SIZE,在Jerry的服务器上处理55万条记录,用了0.3秒,而REDUCE则需花费0.8秒。


image.png

本文提到的所有ABAP代码均可从我的SAP博客获得:


A real case to use REDUCE to finish a task in daily work



相关文章
|
12天前
|
数据处理 开发者
ABAP AT NEW 关键字的用法
ABAP AT NEW 关键字的用法
19 0
|
1月前
|
存储 自然语言处理 BI
ABAP 关键字 READ TEXTPOOL 的用法介绍
ABAP 关键字 READ TEXTPOOL 的用法介绍
21 0
|
6月前
|
XML 存储 中间件
根据指定关键字搜索指定时间范围内的 SAP CRM 中间件 BDOC 的 ABAP 小工具分享
根据指定关键字搜索指定时间范围内的 SAP CRM 中间件 BDOC 的 ABAP 小工具分享
54 0
|
6月前
|
数据处理
SAP ABAP 里 FILTER 关键字的用法举例
SAP ABAP 里 FILTER 关键字的用法举例
47 0
|
6月前
|
数据库
ABAP MESSAGE 关键字的使用方法
ABAP MESSAGE 关键字的使用方法
40 0
|
7月前
|
监控 IDE Devops
有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?
有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?
56 0
|
7月前
|
数据库
SAP ABAP COMMIT WORK 关键字的一些使用要点
SAP ABAP COMMIT WORK 关键字的一些使用要点
56 0
|
数据库
SAP ABAP——数据类型(五)【LIKE系列关键字】
本文主要介绍一下SAP ABAP中的声明数据类型的LIKE系列关键字,主要包括了LIKE、LIKE TABLE OF、LIKE LINE OF、LIKE REF TO。LIKE系列语句是与TYPE系列所对应的语句,前者主要是参照数据类型进行定义,而后者则是参照实例化的数据对象进行定义,在下一章中笔者将对数据对象进行详细的讲述。
668 0
SAP ABAP——数据类型(五)【LIKE系列关键字】
SAP ABAP——数据类型(四)【TYPE系列关键字】
本文主要介绍一下SAP ABAP中的声明数据类型的TYPE系列关键字,主要包括了TYPE、TYPE TABLE OF、TYPE LINE OF、TYPE REF TO
557 0
SAP ABAP——数据类型(四)【TYPE系列关键字】
|
监控 IDE 开发工具
有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?(二)
SAP BTP ABAP 环境是用于 ABAP 开发的 SAP 平台即服务 (PaaS) 产品,使开发人员能够利用其传统的本地 ABAP 专业知识,在 SAP 业务技术平台中开发和运行 ABAP 应用程序,或者作为 SAP 软件的扩展或作为独立应用程序。
166 0
有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?(二)

热门文章

最新文章