溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

發(fā)布時間:2020-06-04 01:05:12 來源:網(wǎng)絡(luò) 閱讀:305 作者:raqsoft 欄目:大數(shù)據(jù)

概述:運行在 JVM 上的 SQL 函數(shù)和存儲過程

總所周知,有些數(shù)據(jù)庫沒有強大的分析函數(shù)(eg. Mysql), 有些數(shù)據(jù)庫沒有存儲過程(eg. Vertica),當(dāng)遇到復(fù)雜的數(shù)據(jù)計算,往往只能通過 Python,R 等外部腳本來實現(xiàn),但這些腳本語言和主流工程語言(Java)集成性不好,如果直接用工程語言實現(xiàn)類似 SQL 函數(shù)和存儲過程的功能,經(jīng)常只是針對某個計算需求編寫冗長的代碼,代碼幾乎不可復(fù)用。

另外,即便擁有強大的分析函數(shù),實現(xiàn)稍復(fù)雜的邏輯其實也不算容易,比如下面這種常見的業(yè)務(wù)計算,找出“銷售額占到一半的前 n 個客戶,并按銷售額從大到小排序”,在 Oracle 中 SQL 實現(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 descwith A as
(selectCUSTOM,SALESAMOUNT,row_number() over (order by SALESAMOUNT) RANKING
from SALES)select CUSTOM,SALESAMOUNTfrom (select CUSTOM,SALESAMOUNT,sum(SALESAMOUNT) over (order by RANKING) AccumulativeAmountfrom A)where AccumulativeAmount>(select sum(SALESAMOUNT)/2 from SALES)order by SALESAMOUNT desc

說明:按照銷售額累計值從小到大排序,通過累計值大于“一半銷售額”的條件,逆向找出占到銷售額一半的客戶。為了避免窗口函數(shù)在計算累計值時對銷售額相同的值處理出現(xiàn)錯誤,用子查詢先計算了排名。

下面是用集算器實現(xiàn)相同邏輯的代碼:
讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大
從上述代碼我們可以看到,集算器利用一套簡潔的語法取代了需嵌套 SQL+ 窗口函數(shù)才能實現(xiàn)的邏輯,并且具有通用一致性(任何數(shù)據(jù)源代碼一致)。

集算器是一套運行在 JVM 上專門處理結(jié)構(gòu)化數(shù)據(jù)的腳本語言,類似用 SQL 函數(shù)和存儲過程,與 Java 集成可以創(chuàng)建可移植、功能強大和與數(shù)據(jù)庫無關(guān)的計算邏輯,運行于中間層的計算邏輯和運行于數(shù)據(jù)庫層的數(shù)據(jù)邏輯之間的分離,提高了應(yīng)用程序的可擴展性、靈活性和可維護性。

應(yīng)用場景:報表數(shù)據(jù)準(zhǔn)備

應(yīng)用結(jié)構(gòu)

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

集成后,集算器嵌入報表應(yīng)用層,相當(dāng)于本地的邏輯數(shù)據(jù)庫(不需要單獨服務(wù)器部署),在報表與數(shù)據(jù)源間作為報表數(shù)據(jù)準(zhǔn)備層,完成各種復(fù)雜的計算任務(wù)。

如何集成

下面以 Vertica 為數(shù)據(jù)源,Birt 為報表工具,描述怎樣集成 esProc 作為數(shù)據(jù)準(zhǔn)備層。

(一) Birt 開發(fā)環(huán)境

1、 基礎(chǔ) jar 集成

集算器 JDBC 需要三個基礎(chǔ) jar 包,都可以在 [esProc 安裝目錄]\esProc\lib 目錄下找到,分別為:

dm.jar 集算器計算引擎及JDBC驅(qū)動包
jdom.jar 解析配置文件
icu4j\_3\_4_5.jar 處理國際化dm.jar 集算器計算引擎及JDBC驅(qū)動包jdom.jar 解析配置文件icu4j\_3\_4_5.jar 處理國際化

除了基礎(chǔ)包外,還有一些為完成特定功能的 jar 包。如,要在集算器 JDBC 用其它數(shù)據(jù)庫作為集算器的數(shù)據(jù)源,那么還需要相應(yīng)數(shù)據(jù)庫的驅(qū)動 jar 包,本文涉及到 vertica,所以要同時增加其 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.xml,主要包含集算器授權(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.xml 拷貝至應(yīng)用的 WEB-INF\classes 下

例一:常規(guī)調(diào)用

1、 Vertica 內(nèi) Sales 表字段及數(shù)據(jù)說明(通過 vsql 查詢,本測試庫有 2013/14/15 年數(shù)據(jù))
讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大
2、 編寫并部署 esProc 腳本

(1) esProc 設(shè)計器添加 vertica JDBC 驅(qū)動包

vertica 官網(wǎng)下載 jdbc 驅(qū)動包(如,vertica-jdbc-9.1.0-0.jar),放至【esProc 安裝目錄】\common\jdbc 下

(2) 新增 vertica 數(shù)據(jù)源

打開設(shè)計器,Tool—Datasource connection 新增 JDBC 方式連接

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

點 ok 保存,再點 connect 連接

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

數(shù)據(jù)源名稱變?yōu)榉凵幢硎具B接成功。

(3) 編寫算法腳本 (文件:VerticaExternalProcedures.dfx)

File – New

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

(4) 部署腳本

將腳本文件部署到 raqsoftConfig.xml 配置的腳本文件主目錄下。

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

3、 esProc 配置文件 raqsoftConfig.xml 內(nèi)增加 verticaLink 數(shù)據(jù)源連接配置

<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><DB name="verticaLink"><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)新建報表,并增加 esProc 數(shù)據(jù)源“esProcConnection”

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

Driver class 為”com.esproc.jdbc.InternalDriver(v1.0)”,會用到 dm.jar 等
Database URL 為”jdbc:esproc:local://”

5、 Birt 調(diào)用 Vertica 外部存儲過程(esProc 數(shù)據(jù)集)

新建“Data Sets”,選擇配置的集算器數(shù)據(jù)源(esProcConnection),數(shù)據(jù)集類型選擇存儲過程(SQL Stored Procedure Query)
讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大
Next,查詢腳本(Query-Query Text)輸入:{call VerticaExternalProcedures()}

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

其中:VerticaExternalProcedures 為 esProc 腳本文件名

Finish,預(yù)覽數(shù)據(jù)(Preview Results)

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

此時,便看到了把 esProc 腳本作為 Vertica 外部存儲過程取數(shù)輔助計

算的過程。

6、 Birt Web 端呈現(xiàn)

以簡單的網(wǎng)格報表為例

報表設(shè)計如下

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

Web 發(fā)布預(yù)覽

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

例二:參數(shù)調(diào)用

這里把“找出訂單銷售額占到一半的前 n 個客戶,并按銷售額從大到小排序”,改為要求按年查詢,即“按年度查詢訂單銷售額占到一半的前 n 個客戶,并按銷售額從大到小排序”,因此增加了參數(shù)過濾功能。

下面看下具體的改法:

1、 esProc 腳本增加按年度參數(shù)及過濾功能

打開 esProc 設(shè)計器,Program – Parameter – Add

參數(shù)名為“qyear”(可與報表參數(shù)名不同)

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

腳本改動:

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

注:A2 增加條件過濾

2、 報表內(nèi)增加年度參數(shù)

報表增加按年查詢的入口參數(shù),參數(shù)名為“qyear”

開發(fā)工具打開報表,Data Explorer – Report Parameter – new patameter

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

Default value 為 qyear 的默認(rèn)值。

3、 報表數(shù)據(jù)集增加數(shù)據(jù)集參數(shù)并與報表參數(shù)綁定

Data set 內(nèi)編輯 VerticaExternalProcedures 數(shù)據(jù)集

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

Query Text 改為“{call VerticaExternalProcedures(?)}”,? 為入口參數(shù)年

度,此處用占位符設(shè)置。

選 Parameters,增加數(shù)據(jù)集參數(shù) qyear 并與報表參數(shù) qyear 綁定。

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

Preview Results, 這里根據(jù) qyear 默認(rèn)值僅有查詢 2013 年數(shù)據(jù)

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

改為“2015”后

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

4、 Web 端預(yù)覽

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

查詢“2015”年數(shù)據(jù)

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

修改或 url 傳入 qyear 為“2013”年后

讓Birt報表腳本數(shù)據(jù)源變得既簡單又強大

更多 "birt 整合方案" 詳見:http://c.raqsoft.com.cn/tag/Report

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI