混合異構資料來源關聯計算最佳化方案

xiaohuihui發表於2019-11-22

在報表專案中,報表資料來源常常會來自於多種異構資料來源,例如:關係型資料庫(oracle、db2、mysql)、nosql 資料庫(mongodb)、http 資料來源、hadoop(hive、hdfs),甚至是 excel 或者文字檔案。針對這類情況,通常的做法是採用 ETL 工具,將這些資料來源都同步到資料倉儲中再進行計算。不過這種做法存在以下問題:

1、配置複雜,難度較大;

2、成本較高;

3、資料無法實時訪問,時間延遲較長;

4、資料倉儲的建設和管理都比較複雜;

5、如果資料量很大效率會很低,而且要不斷的 ETL 各個應用系統的同步資料;

6、資料倉儲利用的也是傳統資料庫的技術,負載增大的時候需要用較高的成本進行擴容。

和這種傳統做法相比,採用潤乾報表可以簡單直接地實現混合資料來源報表,具體做法是透過內建的集算引擎直接讀取各種混合資料來源,讓資料採用最合適的方式儲存,最終以較小的成本呈現基於混合資料來源的實時報表。ETL 方式和潤乾報表方式在體系結構上的對比如下圖所示:

imagepng

下面,透過《州銷售人員銷售報表》的設計製作來看一下具體的實現步驟。報表如下圖:

imagepng

報表的銷售資料來自於銷售系統的 mongodb 資料庫,銷售員的資訊則來自人力資源系統的 db2 資料庫。採用潤乾報表的混合資料來源方式,報表資料來源不需要定期同步,不會有時間上的延遲。

第一步,在集算器設計器中編寫指令碼,並儲存為 statesales.dfx,指令碼內容如下:

A
1 >hrdb=connect(“db22”)
2 =hrdb.query(“select * from employee where state=?”,state)
3 =mongodb(“ ”)
4 =A3.find(“orders”,,“{_id:0}”).fetch()
5 =A4.switch@i(SELLERID,A2:EID)
6 =A5.new(ORDERID,CLIENT,SELLERID.NAME:SELLERNAME,AMOUNT,ORDERDATE)
7 >hrdb.close()
8 >A3.close()
9 result A6

程式碼說明:

A1:連線預先配置好的 db22 資料來源。

A2:執行 SQL,從表 employee 取數,引數 state=“California”。

A3、A4:從銷售系統的 mongodb 讀取 collection orders。

A5:使用集算器的 switch 函式,將 A4 中的 sellerid 欄位切換成 A2 中的記錄,關聯條件為 sellerid=eid。@i 選項是指如果找不到對應的記錄,則刪除該行。

A6:生成一個新的序表,得到需要的欄位。

A7、A8:關閉資料庫連線。

A9:返回給集算報表。

第二,在報表設計器中定義引數 state,配置集算資料集:

imagepng

第三,設計報表如下:

imagepng

執行報表,輸入引數計算後,即可得到前面希望的報表。報表上部的查詢介面是潤乾報表自動提供的“引數模板”功能。引數模板和 db2、mongodb 資料來源配置的具體做法參見教程和其他文件,這裡不再贅述。

需要說明的是,如果資料來源型別發生了變化,只需進行小幅改動即可使報表生效。比如新上線的銷售系統採用了 oracle 資料庫,只要修改 statesales.dfx 的 A1 改為:

hrdb=connect(“ora”)

同時複製 oracle jdbc 驅動、配置 oracle 資料庫的連線引數即可。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2665344/,如需轉載,請註明出處,否則將追究法律責任。

相關文章