概述:運(yùn)行在 JVM 上的 SQL 函數(shù)和存儲過程
總所周知,有些數(shù)據(jù)庫沒有強(qiáng)大的分析函數(shù)(eg. Mysql), 有些數(shù)據(jù)庫沒有存儲過程(eg. Vertica),當(dāng)遇到復(fù)雜的數(shù)據(jù)計(jì)算,往往只能通過 Python,R 等外部腳本來實(shí)現(xiàn),但這些腳本語言和主流工程語言(Java)集成性不好,如果直接用工程語言實(shí)現(xiàn)類似 SQL 函數(shù)和存儲過程的功能,經(jīng)常只是針對某個(gè)計(jì)算需求編寫冗長的代碼,代碼幾乎不可復(fù)用。
另外,即便擁有強(qiáng)大的分析函數(shù),實(shí)現(xiàn)稍復(fù)雜的邏輯其實(shí)也不算容易,比如下面這種常見的業(yè)務(wù)計(jì)算,找出“銷售額占到一半的前 n 個(gè)客戶,并按銷售額從大到小排序”,在 Oracle 中 SQL 實(shí)現(xiàn)如下:
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
說明:按照銷售額累計(jì)值從小到大排序,通過累計(jì)值大于“一半銷售額”的條件,逆向找出占到銷售額一半的客戶。為了避免窗口函數(shù)在計(jì)算累計(jì)值時(shí)對銷售額相同的值處理出現(xiàn)錯(cuò)誤,用子查詢先計(jì)算了排名。
下面是用集算器實(shí)現(xiàn)相同邏輯的代碼:
從上述代碼我們可以看到,集算器利用一套簡潔的語法取代了需嵌套 SQL+ 窗口函數(shù)才能實(shí)現(xiàn)的邏輯,并且具有通用一致性(任何數(shù)據(jù)源代碼一致)。
集算器是一套運(yùn)行在 JVM 上專門處理結(jié)構(gòu)化數(shù)據(jù)的腳本語言,類似用 SQL 函數(shù)和存儲過程,與 Java 集成可以創(chuàng)建可移植、功能強(qiáng)大和與數(shù)據(jù)庫無關(guān)的計(jì)算邏輯,運(yùn)行于中間層的計(jì)算邏輯和運(yùn)行于數(shù)據(jù)庫層的數(shù)據(jù)邏輯之間的分離,提高了應(yīng)用程序的可擴(kuò)展性、靈活性和可維護(hù)性。
應(yīng)用場景:報(bào)表數(shù)據(jù)準(zhǔn)備
應(yīng)用結(jié)構(gòu)
集成后,集算器嵌入報(bào)表應(yīng)用層,相當(dāng)于本地的邏輯數(shù)據(jù)庫(不需要單獨(dú)服務(wù)器部署),在報(bào)表與數(shù)據(jù)源間作為報(bào)表數(shù)據(jù)準(zhǔn)備層,完成各種復(fù)雜的計(jì)算任務(wù)。
如何集成
下面以 Vertica 為數(shù)據(jù)源,Birt 為報(bào)表工具,描述怎樣集成 esProc 作為數(shù)據(jù)準(zhǔn)備層。
(一) Birt 開發(fā)環(huán)境
1、 基礎(chǔ) jar 集成
集算器 JDBC 需要三個(gè)基礎(chǔ) jar 包,都可以在 [esProc 安裝目錄]\esProc\lib 目錄下找到,分別為:
dm.jar 集算器計(jì)算引擎及JDBC驅(qū)動包
jdom.jar 解析配置文件
icu4j\_3\_4_5.jar 處理國際化
除了基礎(chǔ)包外,還有一些為完成特定功能的 jar 包。如,要在集算器 JDBC 用其它數(shù)據(jù)庫作為集算器的數(shù)據(jù)源,那么還需要相應(yīng)數(shù)據(jù)庫的驅(qū)動 jar 包,本文涉及到 vertica,所以要同時(shí)增加其 JDBC 驅(qū)動包(以 vertica9.1。0 為例)
vertica-jdbc-9.1.0-0.jar vertica 官網(wǎng)即可下載
獲取到以上 Jar 后,將其拷貝至 Birt 開發(fā)環(huán)境 [安裝目錄]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212 下。
注意:標(biāo)紅部分,不同 birt 版本略有不同
2、 配置文件集成
raqsoftConfig. ,主要包含集算器授權(quán)、腳本文件路徑、其他作為集算器數(shù)據(jù)源的連接配置等。
可在 [esProc 安裝目錄]\esProc\config 下找到,需復(fù)制后放置在類路徑下,同樣將其拷貝至 Birt 開發(fā)環(huán)境 [安裝目錄]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212 下。
注意:配置文件名不能改變
(二) Birt 應(yīng)用環(huán)境
1、 將(一)中的所有 jar 拷貝至應(yīng)用的 WEB-INF\lib 下
2、 將 raqsoftConfig. 拷貝至應(yīng)用的 WEB-INF\classes 下
例一:常規(guī)調(diào)用
1、 Vertica 內(nèi) Sales 表字段及數(shù)據(jù)說明(通過 vsql 查詢,本測試庫有 2013/14/15 年數(shù)據(jù))
2、 編寫并部署 esProc 腳本
(1) esProc 設(shè)計(jì)器添加 vertica JDBC 驅(qū)動包
vertica 官網(wǎng)下載 jdbc 驅(qū)動包(如,vertica-jdbc-9.1.0-0.jar),放至【esProc 安裝目錄】\common\jdbc 下
(2) 新增 vertica 數(shù)據(jù)源
打開設(shè)計(jì)器,Tool—Datasource connection 新增 JDBC 方式連接
點(diǎn) ok 保存,再點(diǎn) connect 連接
數(shù)據(jù)源名稱變?yōu)榉凵幢硎具B接成功。
(3) 編寫算法腳本 (文件:VerticaExternalProcedures.dfx)
File – New
(4) 部署腳本
將腳本文件部署到 raqsoftConfig. 配置的腳本文件主目錄下。
3、 esProc 配置文件 raqsoftConfig. 內(nèi)增加 vertica 數(shù)據(jù)源連接配置
DB name="vertica ">
property name="url" value="jdbc:vertica://192.168.10.10:5433/ForEsprocTestDB"/>
property name="driver" value="com.vertica.jdbc.Driver"/>
property name="type" value="0"/>
property name="user" value="dbadmin"/>
property name="password" value="runqian"/>
property name="batchSize" value="0"/>
property name="autoConnect" value="false"/>
property name="useSchema" value="false"/>
property name="addTilde" value="false"/>
property name="needTransContent" value="false"/>
property name="needTransSentence" value="false"/>
property name="caseSentence" value="false"/>
/DB>
4、 Birt 開發(fā)工具內(nèi)新建報(bào)表,并增加 esProc 數(shù)據(jù)源“esProcConnection”
Driver class 為”com.esproc.jdbc.InternalDriver(v1.0)”,會用到 dm.jar 等
Data URL 為”jdbc:esproc:local://"
5、 Birt 調(diào)用 Vertica 外部存儲過程(esProc 數(shù)據(jù)集)
新建“Data Sets”,選擇配置的集算器數(shù)據(jù)源(esProcConnection),數(shù)據(jù)集類型選擇存儲過程(SQL Stored Procedure Query)
Next,查詢腳本(Query-Query Text)輸入:{call VerticaExternalProcedures()}
其中:VerticaExternalProcedures 為 esProc 腳本文件名
Finish,預(yù)覽數(shù)據(jù)(Preview Results)
此時(shí),便看到了把 esProc 腳本作為 Vertica 外部存儲過程取數(shù)輔助計(jì)
算的過程。
6、 Birt Web 端呈現(xiàn)
以簡單的網(wǎng)格報(bào)表為例
報(bào)表設(shè)計(jì)如下
Web 發(fā)布預(yù)覽
例二:參數(shù)調(diào)用
這里把“找出訂單銷售額占到一半的前 n 個(gè)客戶,并按銷售額從大到小排序”,改為要求按年查詢,即“按年度查詢訂單銷售額占到一半的前 n 個(gè)客戶,并按銷售額從大到小排序”,因此增加了參數(shù)過濾功能。
下面看下具體的改法:
1、 esProc 腳本增加按年度參數(shù)及過濾功能
打開 esProc 設(shè)計(jì)器,Program – Parameter – Add
參數(shù)名為“qyear”(可與報(bào)表參數(shù)名不同)
腳本改動:
注:A2 增加條件過濾
2、 報(bào)表內(nèi)增加年度參數(shù)
報(bào)表增加按年查詢的入口參數(shù),參數(shù)名為“qyear”
開發(fā)工具打開報(bào)表,Data Explorer – Report Parameter – new patameter
Default value 為 qyear 的默認(rèn)值。
3、 報(bào)表數(shù)據(jù)集增加數(shù)據(jù)集參數(shù)并與報(bào)表參數(shù)綁定
Data set 內(nèi)編輯 VerticaExternalProcedures 數(shù)據(jù)集
Query Text 改為“{call VerticaExternalProcedures(?)}”,? 為入口參數(shù)年
度,此處用占位符設(shè)置。
選 Parameters,增加數(shù)據(jù)集參數(shù) qyear 并與報(bào)表參數(shù) qyear 綁定。
Preview Results, 這里根據(jù) qyear 默認(rèn)值僅有查詢 2013 年數(shù)據(jù)
改為“2015”后
4、 Web 端預(yù)覽
查詢“2015”年數(shù)據(jù)
修改或 url 傳入 qyear 為“2013”年后
更多 "birt 整合方案" 詳見: http://c.raqsoft.com.cn/tag/Report
總結(jié)
以上所述是小編給大家介紹的如何讓Birt報(bào)表腳本數(shù)據(jù)源變得既簡單又強(qiáng)大,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!