多個異構資料庫如何關聯查詢

xiaohuihui發表於2020-06-16

DBlink 只適合同種資料庫關聯,難以關聯異構庫。其他方式不是改變部署架構,就是增加開發工作量,實施起來困難很多。

開發難度小的方式貌似是 ETL,把異構庫變成同構庫,就可以用熟悉的方式寫關聯 SQL。但這種方式需要改變原來的部署架構,硬加一個 ETL 層和一個資料集市層,一般還得加個管理員去維護定時排程,或者額外寫程式碼判斷“資料是否 ETL 完畢”。更大的問題是,這種方式需要把實時計算變成延遲計算,甲方爸爸知道了恐怕會拍桌子。

徹底的解決方案貌似是微服務,把高耦合的 ODBC/JDBC 介面變成低耦合的 http 介面,這樣就可以用統一的 json 或 xml 去傳輸資料。但這種方式要針對每張表開發資料服務介面,要針對每種演算法開發客戶端介面,還要用陌生的框架和類庫,要解決資料庫外的許可權安全……工作量頂天了。而且,具體的運算還得硬寫。

較現實的方法還可以用高階語言比如 JAVA,先用 SQL 把異構資料取過來,再用 arraylist 轉成 2 個類,接下來就可以進行 list 之間的 join 了。但這件事等於拿 JAVA 手工替代 SQL,簡單的合併還湊合,關聯查詢就難寫了,況且還有子查詢、關聯後分組彙總等實用演算法。總之,JAVA 缺乏結構化類庫,替代 SQL 的成本非常高。

如果使用集算器來實現異構庫關聯,則可以保持原部署架構,開發工作量也不大。首先,SPL 可用統一的資料結構訪問任意的資料庫表,這就解決異構的問題。其次,SPL 具有豐富的結構化類庫,很容易實現關聯查詢以及後續的實用演算法,經常比 SQL 還簡單。最後,集算器提供了 JDBC\ODBC 介面,程式設計師只需引入驅動程式,就可以在原來的程式碼上實現異構庫關聯。

比如 java 透過集算器的 JDBC 驅動,訪問 Oracle 的 orders 表,並關聯 MySQL 的 customer 表,最後對關聯結果分組彙總:

con=DriverManager.getConnection(“jdbc:esproc:local://”);

ResultSet rs = con.executeQuery(“orcl.query(/“select * from orders/”).join(cust,my.query(/“select * from customer/”):custid,city).groups(city;sum(amount))”);

關於多資料庫關聯,可參

關於集算器 JDBC 嵌入 JAVA,可參

關於集算器安裝使用、獲得免費授權和相關技術資料,可以參

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

相關文章