百萬級分組大報表開發與呈現

在《秒級展示的百萬級大清單報表怎麼作》中,咱們介紹了不管 RDB 仍是非 RDB,潤乾報表都可以經過異步線程實現秒級海量大清單報表(如下簡稱:大報表)。實際業務中,除了查詢明細,有時還要展示全量彙總數據,或者查詢分組明細和計算分組彙總。本文就將介紹這些帶有彙總和分組的大報表的開發方法。html

帶彙總的大報表

       在大報表中計算彙總值與常規報表基於報表內數據進行的彙總不一樣,大報表因爲採用異步線程,所以沒法經過報表內數據進行彙總(由於每次只能取到部分數據),只能在數據處理階段計算彙總值並交給報表呈現。數據庫

咱們仍是使用《秒級展示的百萬級大清單報表怎麼作》中 SQL 源大報表的例子,如今須要在每頁最後一行顯示訂單彙總狀況(訂單數量、訂單總額、運費總額)。segmentfault

製做報表模板

       增長一個數據集 ds2 計算彙總值:併發

     報表中最後一行引入 ds2 彙總值進行呈現,這裏爲了每頁都包含彙總數據,設置最後一行屬性爲報表尾。異步

       固然,帶有彙總的大報表性能跟計算彙總值的 SQL 執行效率強相關,因此可能會發現帶有彙總的大報表要比單純查詢明細慢一些。函數

分組大報表

       實際業務中,簡單呈現大報表清單每每還不夠,有時還須要對海量數據進行分組,呈現彙總及明細狀況。下面,咱們就以訂單數據爲例,查詢一下按地區分組的明細及訂單金額彙總。高併發

需求分析

       首先,須要呈現分組明細的報表沒法在數據源端進行聚合,例如經過 SQL 聚合後就不包含分組明細了,除非再查詢一次進行拼接,但查詢兩次顯然會嚴重影響性能。所以咱們須要儘可能將明細數據讀出後在應用端進行分組聚合。性能

       那問題就來了,因爲海量數據要經過分批讀取的方法進行呈現,如何保證讀取的每批分組數據是完整的?若是分組數據不完整,分組聚合的結果顯然也就不正確了。所以,除了要保證能在應用端實現聚合,還要保證批量讀取數據時分組數據的完整性。fetch

       下面就是潤乾報表結合集算器(數據集)實現分組大報表的過程。大數據

報表數據準備

       咱們須要編寫集算器 SPL 腳本進行數據準備。這裏,咱們要編寫兩個 SPL 腳本,分別實現:查詢分組明細並計算彙總,以及經過遊標分批爲報表返回結果集。

SPL 腳本 1:group-detail.dfx

設置腳本參數:

編寫 SPL 腳本:

圖片描述
SPL 解析:

一、 A2 查詢數據庫,SQL 中指定按照分組字段(貨主地區)排序,以便後續能夠每次取出整個分組進行彙總。爲此須要在排序字段上創建索引,避免全表排序時間過長。

二、 A3 循環遊標,以貨主地區爲標記,保證每次讀取的記錄數爲一個地區數據

三、 B4 增長標誌位,用於後續報表展示中突出彙總行。標誌爲 0 時表示是明細記錄

四、 B5 針對每一個分組進行彙總

五、 B6 將分組值追加到明細記錄中,標誌設爲 1,表示是彙總記錄

六、 B7 返回分組明細和彙總集合。注意這裏 return 寫在循環內,所以會屢次返回分組集合

關於 for cs,n;x 用法

在集算器 SPL 腳本中,for cs,n;x 表示針對遊標 cs 經過循環遍歷數據,每輪從遊標讀取 n 條記錄或者直到記錄中的 x 發生變化,循環所有結束後關閉遊標。大數據量的分組取數是這種循環的經常使用之處。若是省略了 n 和 x,那就簡單地返回遊標中全部數據並關閉遊標。函數的具體說明能夠參考:http://doc.raqsoft.com.cn/esproc/func/forcsnx.html

       當大數據集按照分組字段有序時,這種取數方式每次能夠讀取一個完整分組到內存中參與計算,不過這時仍然要求分組不能很大(內存能裝下)。而在金融和電信行業中,常常要基於單用戶作數據分析,也就是按用戶分組,而每一個用戶的流水記錄規模又較大,常規的拆分方法做起來十分複雜。而經過集算器就能夠很好地解決這類問題了。

SPL 腳本 2:main.dfx

設置腳本參數:

編寫 SPL 腳本:

圖片描述

       前一個 SPL 腳本 group-detail.dfx 解決了分組查詢明細並彙總計算的問題。這個腳本 main.dfx 則能夠分批次取數並提供給潤乾報表,從而實現異步大報表呈現。腳本中 A1 經過 cursor 函數直接調用前一腳本生成遊標,由 A2 將遊標返回給報表。

關於 cursor() 函數

       使用 cursor 函數調用 SPL 腳本生成遊標時,被調用的 SPL 腳本能夠有多個返回結果集(例如在 for 循環中的多個 return),而遊標取數(fetch)時能夠依次使用多個 return 結果,無需等待全部結果集都準備好再使用,原理以下圖所示。函數的具體說明能夠參考:http://doc.raqsoft.com.cn/esproc/func/cursordfx.html

結合大報表使用 cursor() 函數運行原理

設計報表模板

設置報表參數,查詢起止日期:

設置數據集引用 main.dfx 並傳遞日期參數:

       按照大報表模板設計思路,編寫表達式

爲了將彙總行高亮顯示出來,這裏利用了數據準備階段增長的標誌位 flag 列,當 flag 值爲 1 的時候表明該行爲彙總行,設置背景色表達式:if(A3==1,-3355444)

設置大數據集

發佈到 WEB

       將作好的模板發佈到 WEB 端,效果以下:

固然,標誌位 flag 列也能夠設置爲隱藏。

效果調整

       調整報表模板,將標誌位 flag 列隱藏,並設置 B3 格的擴展屬性 同值合併爲「縱向合併」

展示時分組列則帶有合併格的效果:

注意事項

       在《秒級展示的百萬級大清單報表怎麼作》中,咱們提示了大報表不要全表排序,也不適合高併發場景。除此之外,對於帶有分組彙總和明細的大報表還應該注意:

單個分組不宜過大

       因爲計算分組明細和彙總值時須要將某一個分組數據所有加載到內存中進行計算,所以分組相對內存容量不宜過大,從而確保單個分組數據能進行全內存計算。

相關文章
相關標籤/搜索