讓 Birt 報表指令碼資料來源變得既簡單又強大
概述:執行在 JVM 上的 SQL 函式和儲存過程
總所周知,有些資料庫沒有強大的分析函式(eg. Mysql), 有些資料庫沒有儲存過程(eg. Vertica),當遇到複雜的資料計算,往往只能透過 Python,R 等外部指令碼來實現,但這些指令碼語言和主流工程語言(Java)整合性不好,如果直接用工程語言實現類似 SQL 函式和儲存過程的功能,經常只是針對某個計算需求編寫冗長的程式碼,程式碼幾乎不可複用。
另外,即便擁有強大的分析函式,實現稍複雜的邏輯其實也不算容易,比如下面這種常見的業務計算,找出“銷售額佔到一半的前 n 個客戶,並按銷售額從大到小排序”,在 Oracle 中 SQL 實現如下:
with A as (selectCUSTOM,SALESAMOUNT,row_number() over (order by SALESAMOUNT) RANKING from SALES) select CUSTOM,SALESAMOUNT from (select CUSTOM,SALESAMOUNT,sum(SALESAMOUNT) over (order by RANKING) AccumulativeAmount from A) where AccumulativeAmount>(select sum(SALESAMOUNT)/2 from SALES) order by SALESAMOUNT desc
說明:按照銷售額累計值從小到大排序,透過累計值大於“一半銷售額”的條件,逆向找出佔到銷售額一半的客戶。為了避免視窗函式在計算累計值時對銷售額相同的值處理出現錯誤,用子查詢先計算了排名。
下面是用集算器實現相同邏輯的程式碼:
從上述程式碼我們可以看到,集算器利用一套簡潔的語法取代了需巢狀 SQL+ 視窗函式才能實現的邏輯,並且具有通用一致性(任何資料來源程式碼一致)。
集算器是一套執行在 JVM 上專門處理結構化資料的指令碼語言,類似用 SQL 函式和儲存過程,與 Java 整合可以建立可移植、功能強大和與資料庫無關的計算邏輯,執行於中間層的計算邏輯和執行於資料庫層的資料邏輯之間的分離,提高了應用程式的可擴充套件性、靈活性和可維護性。
應用場景:報表資料準備
應用結構
整合後,集算器嵌入報表應用層,相當於本地的邏輯資料庫(不需要單獨伺服器部署),在報表與資料來源間作為報表資料準備層,完成各種複雜的計算任務。
如何整合
下面以 Vertica 為資料來源,Birt 為報表工具,描述怎樣整合 esProc 作為資料準備層。
(一) Birt 開發環境
1、 基礎 jar 整合
集算器 JDBC 需要三個基礎 jar 包,都可以在 [esProc 安裝目錄]\esProc\lib 目錄下找到,分別為:
dm.jar 集算器計算引擎及JDBC驅動包 jdom.jar 解析配置檔案 icu4j\_3\_4_5.jar 處理國際化
除了基礎包外,還有一些為完成特定功能的 jar 包。如,要在集算器 JDBC 用其它資料庫作為集算器的資料來源,那麼還需要相應資料庫的驅動 jar 包,本文涉及到 vertica,所以要同時增加其 JDBC 驅動包(以 vertica9.1。0 為例)
vertica-jdbc-9.1.0-0.jar vertica 官網即可下載
獲取到以上 Jar 後,將其複製至 Birt 開發環境 [安裝目錄]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212 下。
注意:標紅部分,不同 birt 版本略有不同
2、 配置檔案整合
raqsoftConfig.xml,主要包含集算器授權、指令碼檔案路徑、其他作為集算器資料來源的連線配置等。
可在 [esProc 安裝目錄]\esProc\config 下找到,需複製後放置在類路徑下,同樣將其複製至 Birt 開發環境 [安裝目錄]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212 下。
注意:配置檔名不能改變
(二) Birt 應用環境
1、 將(一)中的所有 jar 複製至應用的 WEB-INF\lib 下
2、 將 raqsoftConfig.xml 複製至應用的 WEB-INF\classes 下
例一:常規呼叫
1、 Vertica 內 Sales 表欄位及資料說明(透過 vsql 查詢,本測試庫有 2013/14/15 年資料)
2、 編寫並部署 esProc 指令碼
(1) esProc 設計器新增 vertica JDBC 驅動包
vertica 官網下載 jdbc 驅動包(如,vertica-jdbc-9.1.0-0.jar),放至【esProc 安裝目錄】\common\jdbc 下
(2) 新增 vertica 資料來源
開啟設計器,Tool—Datasource connection 新增 JDBC 方式連線
點 ok 儲存,再點 connect 連線
資料來源名稱變為粉色即表示連線成功。
(3) 編寫演算法指令碼 (檔案:VerticaExternalProcedures.dfx)
File – New
(4) 部署指令碼
將指令碼檔案部署到 raqsoftConfig.xml 配置的指令碼檔案主目錄下。
3、 esProc 配置檔案 raqsoftConfig.xml 內增加 verticaLink 資料來源連線配置
<DB name="verticaLink"> <property name="url" value="jdbc:vertica://192.168.10.10:5433/ForEsprocTestDB"></property> <property name="driver" value="com.vertica.jdbc.Driver"></property> <property name="type" value="0"></property> <property name="user" value="dbadmin"></property> <property name="password" value="runqian"></property> <property name="batchSize" value="0"></property> <property name="autoConnect" value="false"></property> <property name="useSchema" value="false"></property> <property name="addTilde" value="false"></property> <property name="needTransContent" value="false"></property> <property name="needTransSentence" value="false"></property> <property name="caseSentence" value="false"></property> </DB>
4、 Birt 開發工具內新建報表,並增加 esProc 資料來源“esProcConnection”
Driver class 為”com.esproc.jdbc.InternalDriver(v1.0)”,會用到 dm.jar 等
Database URL 為”jdbc:esproc:
5、 Birt 呼叫 Vertica 外部儲存過程(esProc 資料集)
新建“Data Sets”,選擇配置的集算器資料來源(esProcConnection),資料集型別選擇儲存過程(SQL Stored Procedure Query)
Next,查詢指令碼(Query-Query Text)輸入:{call VerticaExternalProcedures()}
其中:VerticaExternalProcedures 為 esProc 指令碼檔名
Finish,預覽資料(Preview Results)
此時,便看到了把 esProc 指令碼作為 Vertica 外部儲存過程取數輔助計
算的過程。
6、 Birt Web 端呈現
以簡單的網格報表為例
報表設計如下
Web 釋出預覽
例二:引數呼叫
這裡把“找出訂單銷售額佔到一半的前 n 個客戶,並按銷售額從大到小排序”,改為要求按年查詢,即“按年度查詢訂單銷售額佔到一半的前 n 個客戶,並按銷售額從大到小排序”,因此增加了引數過濾功能。
下面看下具體的改法:
1、 esProc 指令碼增加按年度引數及過濾功能
開啟 esProc 設計器,Program – Parameter – Add
引數名為“qyear”(可與報表引數名不同)
指令碼改動:
注:A2 增加條件過濾
2、 報表內增加年度引數
報表增加按年查詢的入口引數,引數名為“qyear”
開發工具開啟報表,Data Explorer – Report Parameter – new patameter
Default value 為 qyear 的預設值。
3、 報表資料集增加資料集引數並與報表引數繫結
Data set 內編輯 VerticaExternalProcedures 資料集
Query Text 改為“{call VerticaExternalProcedures(?)}”,? 為入口引數年
度,此處用佔位符設定。
選 Parameters,增加資料集引數 qyear 並與報表引數 qyear 繫結。
Preview Results, 這裡根據 qyear 預設值僅有查詢 2013 年資料
改為“2015”後
4、 Web 端預覽
查詢“2015”年資料
修改或 url 傳入 qyear 為“2013”年後
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2671079/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何讓資料清洗工作變得簡單
- BIRT 如何配置動態資料來源
- 讓資料視覺化變得簡單 – JavaScript 圖形庫視覺化JavaScript
- 如何讓你的大檔案上傳變得又穩又快?
- 簡單資料庫及表建立shell指令碼資料庫指令碼
- 掌握這些技巧,讓Excel批次資料清洗變得簡單高效!Excel
- Django學習(四)表單,讓資料庫更強大Django資料庫
- BIRT 怎麼呼叫 Webservice 作為資料來源Web
- 新數科技:讓雲時代企業資料庫轉型變得簡單資料庫
- zt 讓你的密碼好記又強大密碼
- Smartour——讓網頁導覽變得更簡單網頁
- 讓動畫變得更簡單之FLIP技術動畫
- WPF自定義Panel:讓拖拽變得更簡單
- birt報表:BIRT報表在TOMCAT下執行環境配置!Tomcat
- Minitab 2021:讓資料分析變得更簡單,更直觀 win版
- 智簡魔方DCIM系統如何讓資料中心管理變得更簡單
- 你不知道的shell用法和指令碼,簡單&強大指令碼
- [翻譯]Kafka Streams簡介: 讓流處理變得更簡單Kafka
- CollageIt 3 Pro讓照片拼貼製作變得簡單
- k8s-Portainer 讓應用部署變得簡單K8SAI
- 簡單的備份資料庫指令碼資料庫指令碼
- 分解人力資源系統的基礎知識,讓員工變得簡單、快速且有效 2
- 奧威BI系統:做資料視覺化大屏,又快又簡單視覺化
- 達觀智慧單證稽核平臺,讓審單變得如此簡單
- SqlSugar 多資料來源的簡單封裝SqlSugar封裝
- 簡單的單資料來源複製例項——流
- LEARUN快速開發平臺,讓開發變得更簡單
- Mysql資料庫的簡單備份指令碼MySql資料庫指令碼
- ·賈伯斯給IT行業帶來十大變革:讓科技變得更酷行業
- 如何讓開發變得敏捷起來?敏捷
- 騰訊大資料智慧營銷平臺讓“尋 TA ”變得更容易大資料
- 報表怎麼動態選擇資料來源
- 談談Spring Boot 資料來源載入及其多資料來源簡單實現Spring Boot
- 大表裡有資料時表分割槽參考指令碼指令碼
- Avdshare Video Converter,讓影片轉換變得更簡單!IDE
- 無線入侵檢測讓無線安全檢測變得簡單
- 一個簡單資料庫健康檢查指令碼資料庫指令碼
- DataGrip 2023:讓資料庫開發變得更簡單、更高效 mac/win啟用版資料庫Mac