如何增強開源報表或第三方報表工具(如birt摔竿、jasper)的數(shù)據(jù)源及數(shù)據(jù)處理能力

開源報表常規(guī)功能都挺全了面粮,簡單報表也都可以做,但一旦遇到復雜報表继低、特殊源或復雜的數(shù)據(jù)處理的情況下熬苍,解決起來非常麻煩,多數(shù)都要搞硬編碼袁翁。
但實際上柴底,現(xiàn)在有一種方法可以讓這些像birt、jasper等開源報表工具的數(shù)據(jù)處理變的更加強大且更加的簡單梦裂。

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

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

另外掀抹,即便擁有強大的分析函數(shù)虐拓,實現(xiàn)稍復雜的邏輯其實也不算容易,比如下面這種常見的業(yè)務計算傲武,找出“銷售額占到一半的前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 desc

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

下面是用集算器實現(xiàn)相同邏輯的代碼:


集算器腳本

從上述代碼我們可以看到,集算器利用一套簡潔的語法取代了需嵌套SQL+窗口函數(shù)才能實現(xiàn)的邏輯甜刻,并且具有通用一致性(任何數(shù)據(jù)源代碼一致)绍撞。

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

應用場景:報表數(shù)據(jù)準備

應用結構

報表應用結構優(yōu)化

集成后,集算器嵌入報表應用層怪蔑,相當于本地的邏輯數(shù)據(jù)庫(不需要單獨服務器部署)里覆,在報表與數(shù)據(jù)源間作為報表數(shù)據(jù)準備層,完成各種復雜的計算任務缆瓣。

如何集成

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

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

1隧甚、 基礎jar集成

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

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

除了基礎包外戚扳,還有一些為完成特定功能的jar包。如族吻,要在集算器JDBC用其它數(shù)據(jù)庫作為集算器的數(shù)據(jù)源帽借,那么還需要相應數(shù)據(jù)庫的驅動jar包,本文涉及到vertica超歌,所以要同時增加其JDBC驅動包(以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下巍举。

注意:標紅部分脆荷,不同birt版本略有不同

2、 配置文件集成

raqsoftConfig.xml懊悯,主要包含集算器授權蜓谋、腳本文件路徑、其他作為集算器數(shù)據(jù)源的連接配置等炭分。

可在[esProc安裝目錄]\esProc\config下找到桃焕,需復制后放置在類路徑下,同樣將其拷貝至Birt開發(fā)環(huán)境[安裝目錄]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212下欠窒。

注意:配置文件名不能改變

(二) Birt應用環(huán)境

1、 將(一)中的所有jar拷貝至應用的WEB-INF\lib下

2退子、 將raqsoftConfig.xml拷貝至應用的WEB-INF\classes下

例一:常規(guī)調用

1岖妄、 Vertica內Sales表字段及數(shù)據(jù)說明(通過vsql查詢,本測試庫有2013/14/15年數(shù)據(jù))


Vertica

2寂祥、 編寫并部署esProc腳本

(1) esProc設計器添加vertica JDBC驅動包

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

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

打開設計器丸凭,Tool—Datasource connection 新增JDBC方式連接

集算器 數(shù)據(jù)源配置

點ok保存福扬,再點connect連接

數(shù)據(jù)源配置連接

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

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

File – New

增強birt從Vertica的取數(shù)計算的能力

(4) 部署腳本

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

部署集算器腳本文件

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

<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ā)工具內新建報表,并增加esProc數(shù)據(jù)源“esProcConnection”

birt配置集算器數(shù)據(jù)源

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

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

新建“Data Sets”,選擇配置的集算器數(shù)據(jù)源(esProcConnection)且轨,數(shù)據(jù)集類型選擇存儲過程(SQL Stored Procedure Query)


類存儲過程方式調用集算器腳本文件

Next堆巧,查詢腳本(Query-Query Text)輸入:{call VerticaExternalProcedures()}

類存儲過程方式調用集算器腳本文件語法

其中:VerticaExternalProcedures為esProc腳本文件名

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

birt經集算器調用vertica預覽結果

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

算的過程迄薄。

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

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

報表設計如下

birt報表設計

Web發(fā)布預覽

birt報表結果

例二:參數(shù)調用

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

下面看下具體的改法:

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

打開esProc設計器碰缔,Program – Parameter – Add

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

集算器腳本增加參數(shù)過濾

腳本改動:

集算器增加參數(shù)后的腳本

注:A2增加條件過濾

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

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

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

birt增加參數(shù)

Default value 為qyear的默認值。

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

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

birt調用帶參數(shù)的集算器腳本文件

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

度,此處用占位符設置铺董。

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

birt報表參數(shù)與集算器腳本文件參數(shù)綁定

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

帶參數(shù)的集算器腳本返回數(shù)據(jù)在birt內

改為“2015”后

18png

4精续、 Web端預覽

19png

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

20png

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

21png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末坝锰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子重付,更是在濱河造成了極大的恐慌顷级,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件确垫,死亡現(xiàn)場離奇詭異弓颈,居然都是意外死亡帽芽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門翔冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來导街,“玉大人,你說我怎么就攤上這事橘蜜【漳洌” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵计福,是天一觀的道長跌捆。 經常有香客問我,道長象颖,這世上最難降的妖魔是什么佩厚? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮说订,結果婚禮上抄瓦,老公的妹妹穿的比我還像新娘。我一直安慰自己陶冷,他們只是感情好钙姊,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埂伦,像睡著了一般煞额。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沾谜,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天膊毁,我揣著相機與錄音,去河邊找鬼基跑。 笑死婚温,一個胖子當著我的面吹牛,可吹牛的內容都是我干的媳否。 我是一名探鬼主播栅螟,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼篱竭!你這毒婦竟也來了力图?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤室抽,失蹤者是張志新(化名)和其女友劉穎搪哪,沒想到半個月后靡努,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坪圾,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡晓折,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兽泄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漓概。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖病梢,靈堂內的尸體忽然破棺而出胃珍,到底是詐尸還是另有隱情,我是刑警寧澤蜓陌,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布觅彰,位于F島的核電站,受9級特大地震影響钮热,放射性物質發(fā)生泄漏填抬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一隧期、第九天 我趴在偏房一處隱蔽的房頂上張望飒责。 院中可真熱鬧,春花似錦仆潮、人聲如沸宏蛉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拾并。三九已至,卻和暖如春蚌讼,著一層夾襖步出監(jiān)牢的瞬間辟灰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工篡石, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芥喇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓凰萨,卻偏偏與公主長得像继控,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胖眷,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容