ABAP 740从2013年发布至今已通过去很长的时间了,下面这张图来自SAP社区博客:数据库
ABAP News for Release 7.40 – What is ABAP 7.40?编程
图中的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框架的每一个执行步骤,只需紧盯框架的输入,以及执行结果就好了。性能
回到Jerry接受的实际工做任务。德国同事让Jerry在某个CRM测试系统上作个统计,列出在数据库表CRM_JSTO里,OBTYP(Object Type)和STSMA(Status Schema)这两列拥有相同值的内表行的个数。你们能够把"OBTYP和STSMA两列具备相同值的内表行"类比成上图中重复出现的单词。测试
下图是CRM_JSTO的部分行:3d
下图是Jerry完成的任务: 测试系统上内表一共有55多万行,其中有90279行,只维护了OBTYP为TGP,而没有维护STSMA. 排名第二的是COH和CRMLEAD的组合,出现了78722次。orm
稍稍作过一些ABAP开发的朋友们,必定会当即写出下面的代码:cdn
利用SELECT COUNT直接在数据库层完成统计工做。这也是SAP推荐的作法,所谓Code pusudown准则,即能放到HANA数据库层面进行的操做,就尽可能放进去,以充分利用HANA强大的计算能力。在数据库可以完成计算逻辑的前提下,尽可能避免把计算逻辑放到Netweaver ABAP应用层去作。
不过,咱们也须要注意到这种方式的局限性。Jerry以前曾经引用过SAP CTO的名言:
将来的ABAP会走向开放,互联的道路。回到这个需求自己,假设待检索的输入数据不是从ABAP数据库表中来,而是来自HTTP请求,或者第三方系统发过来的IDOC,此时咱们没法再使用OPEN SQL自己的SELECT COUNT操做,而只能在ABAP应用层解决这个问题。
所谓技多不压身,Jerry这里介绍两种用ABAP完成这个需求的方式。
第一种方式比较传统,实如今方法get_result_traditional_way里:
ABAP的LOOP AT GROUP BY这个关键字组合简直就像是为这个需求量身定作通常:给GROUP BY指定obtyp和stsma这两列,而后LOOP AT会自动将输入内表的行记录根据这两列的值进行分组,每组行记录的个数经过关键字GROUP SIZE自动计算出来,每组各自的obtyp和stsma的值,以及组内行记录的条目数,存储在REFERENCE INTO指定的变量group_ref里。ABAP顾问须要作的事情,只是简单地把这些结果存储到输出内表便可。
第二种办法,就是本文标题所述,使用ABAP 740新的REDUCE关键字:
上面的代码乍一看可能以为有点晦涩,但仔细阅读后发现这种方式本质上也采用了和方法一LOOP AT GROUP BY一样的分组策略——根据obtyp和stsma分组,这些子组经过变量<group_key>标识,而后经过第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秒。
本文提到的全部ABAP代码都可从个人SAP博客得到:
A real case to use REDUCE to finish a task in daily work
感谢阅读。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":