利用ABAP 740的新關鍵字REDUCE完成一個實際工作任務
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的部分行:
下圖是Jerry完成的任務: 測試系統上內表一共有55多萬行,其中有90279行,只維護了OBTYP為TGP,而沒有維護STSMA. 排名第二的是COH和CRMLEAD的組合,出現了78722次。
稍稍做過一些ABAP開發的朋友們,一定會立即寫出下面的程式碼:
利用SELECT COUNT直接在資料庫層完成統計工作。這也是SAP推薦的做法,所謂Code pusudown準則,即能放到HANA資料庫層面進行的操作,就儘量放進去,以充分利用HANA強大的計算能力。在資料庫能夠完成計算邏輯的前提下,儘量避免把計算邏輯放到Netweaver ABAP應用層去做。
不過,我們也需要注意到這種方式的侷限性。Jerry之前曾經引用過SAP CTO的名言:
- There is no future with ABAP alone
- There is no future in SAP without ABAP
未來的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的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2662634/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Map-Reduce 思想在 ABAP 程式設計中的一個實際應用案例程式設計
- ABAP 740新的OPEN SQL增強特性SQL
- ABAP 740裡的新語法 - LET表示式
- 如何讓Sublime Text編輯器支援新的ABAP關鍵字
- 一些我工作中經常使用的ABAP新語法和函式,關鍵字,可以提高工作效率函式
- SAP ABAP COMMIT WORK 關鍵字的一些使用要點MIT
- python中快速處理關鍵字map,reduce,filterPythonFilter
- Azure Service Fabric Mesh:一個構建任務關鍵型微服務的平臺微服務
- ABAP關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析
- volatile 關鍵字的工作機制
- 使用quartz.net 完成一個winform版的任務提醒工具quartzORM
- 如何聰明地利用待辦事項 APP 完成任務APP
- 一個由public關鍵字引發的bug
- 手把手教你用一個簡單的2DCNN完成MNIST數字識別任務!CNN
- Docker 關鍵字說明及一鍵構建相關服務Docker
- 目前待完成的任務們
- ABAP 740的新語法 - 使用BO association的方式進行內表連線操作
- 如何高效完成領導安排的複雜工作任務?羅列待辦任務清單很有效
- 剖析 golang 的25個關鍵字Golang
- 一個好用的SAP ABAP工作程式跟蹤工具
- linux實現一個定時任務Linux
- SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer
- 用一個實際例子理解Dockervolume工作原理Docker
- 爬蟲學習日記(六)完成第一個爬蟲任務爬蟲
- 一個具體的例子學習Java volatile關鍵字Java
- C語言的幾個關鍵字C語言
- C++ 62個關鍵字的作用C++
- DM 關鍵字、遮蔽關鍵字
- ABAP Development Tool如何配置程式碼自動完成的快捷鍵dev
- 如何高效利用 GitHub 關鍵字進行搜尋Github
- 實現一個“計劃任務”機制
- 用一個實際例子理解Docker volume工作原理Docker
- out關鍵字和ref關鍵字的區別
- 關於springboot如何做一個定時任務Spring Boot
- Java 中你絕對沒用過的一個關鍵字?Java
- let關鍵字和const關鍵字
- final關鍵字和static關鍵字
- 實現一個併發任務執行框架框架