Hive 如何方便地實現儲存過程?
第一種是 HPL/SQL。這種方式目前還不完善,比如遊標使用限制多,很多功能無法實現,對變數要求嚴格,經常發生不相容的錯誤。只要可除錯,程式碼報錯並非障礙,但 HPL/SQL 的問題在於不可除錯,對於開發者就很不方便。
更不方便的是,HPL/SQL 缺乏 JDBC 介面,無法方便地嵌入 JAVA 程式,只能在 JAVA 中呼叫命令列執行 HPL/SQL,再由 HPL/SQL 實施計算並將結果回寫 Hive 臨時表,最後 JAVA 透過 Hive 的 JDBC 讀取臨時表。
第二種是用 JAVA 開發的 UDF 間接實現。JAVA 缺乏結構化計算類庫,所有的演算法都要硬編碼,比如最基本的二維表要用 ArrayList+HashMap 組合實現,最簡單的分組彙總要寫幾十行,關聯計算更是冗長繁瑣。由於硬編碼很難統一規則,所以即使相似的業務邏輯,具體演算法也是千差萬別,這就導致程式碼可讀性差、維護困難。
JAVA 儲存過程還存在高耦合性的問題。JAVA 類無法進行熱部署,每次修改都要重新編譯並重啟 Hive 服務,這會對生產環境產生嚴重影響。如果設計一個巧妙的結構,也許能降低耦合性,但專案成本必然大幅上升。
如果使用集算器,實現 Hive 儲存過程就會方便很多。
集算器具有豐富的結構化類庫,無論查詢、排序、聚合還是分組彙總、關聯查詢,都可以用內建函式直接實現。集算器也提供了針對結構化資料的分支判斷、迴圈語句、動態語法,複雜業務邏輯也可輕鬆實現。集算器允許設定斷點、跟蹤除錯,以便程式設計師快速排錯。向上介面方面,集算器提供了標準的 JDBC 驅動,供 JAVA 程式碼呼叫,實際的儲存過程則以指令碼檔案的形式存在,修改儲存過程不影響 JAVA 程式碼或 Hive 服務。向下介面方面,集算器除了支援標準的 Hive JDBC,還提供了更高效能的私有介面,兩者都可執行 HSQL 語句。
例子:Hive 中 sales 表按銷售、年、月分組彙總後如下:
儲存過程演算法:調整每個銷售 Q1Q2 的賬務,具體是將 4 月份的 1000 元轉移到 3 月份。要求對同一個銷售同一年的資料做調整,如果 3 月份缺失,則調整時需在 3 月份追加 -1000 的空記錄,以便平衡賬務,如果 4 月份缺失,則調整時在 4 月份追加 1000 的空記錄,都缺失則不做調整。
計算結果應當如下:
集算器儲存過程如下:
|
A | B | C | D |
1 | =connect@l("hiveDB") |
|
|
/connect to hive via jdbc |
2 | =A1.cursor@x("select sellerid,year(orderdate) y,month(orderdate) m,sum(amount)amount from sales group by sellerid,year(orderdate),month(orderdate) order by sellerid, year(orderdate),month(orderdate)") | /run HSQL | ||
3 | =A2.create() |
|
|
/prepare a blank result |
4 | for A2;[sellerid,y] |
|
|
/batch for every year of every seller |
5 |
|
=A4.select(m==3) | =A4.select(m==4) | /reocrd of Mar. and Apr. |
6 |
|
if B5!=[] && C5!=[] | >B5.amount=B5.amount-1000 | /if both exist then modify batch |
7 |
|
|
>C5.amount=C5.amount+1000 |
|
8 |
|
else if B5==[] &&C5!=[] | >A3.record([A4.sellerid,A4.y,3,-1000]) | /if Mar. not exists then add new reocord to result |
9 |
|
|
>C5.amount=C5.amount+1000 | /modify batch |
10 |
|
else if B5!=[] &&C5==[] | >B5.amount=B5.amount-1000 | /if Apr. not exists then add new record to result |
11 |
|
|
>A3.record([A4.sellerid,A4.y,4,1000]) | /modify batch |
12 |
|
>A3.paste@i(A4.(sellerid),A4.(y),A4.(m),A4.(amount)) | /union up this batch to result | |
13 | return A3.sort(sellerid,y,m) |
|
|
/sort and return result |
關於集算器 JDBC 介面,可以參
關於集算器安裝使用、獲得免費授權和相關技術資料,可以參
。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2693510/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- vertica 如何實現儲存過程?儲存過程
- mysql如何呼叫儲存過程MySql儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- 儲存過程與儲存函式儲存過程儲存函式
- SQLSERVER儲存過程SQLServer儲存過程
- 呼叫儲存過程儲存過程
- mysql 儲存過程MySql儲存過程
- unidac儲存過程儲存過程
- firedac儲存過程儲存過程
- Oracle儲存過程Oracle儲存過程
- MySQL儲存過程中如何使用ROLLBACKMySql儲存過程
- JdbcTemplate調儲存過程JDBC儲存過程
- 造數儲存過程儲存過程
- 儲存過程——遊標儲存過程
- 儲存過程 傳 datatable儲存過程
- JAVA儲存過程(轉)Java儲存過程
- MySQL之儲存過程MySql儲存過程
- oracle的儲存過程Oracle儲存過程
- MySQL---------儲存過程MySql儲存過程
- linux呼叫儲存過程Linux儲存過程
- Winform呼叫儲存過程ORM儲存過程
- mysql儲存過程整理MySql儲存過程
- Oracle儲存過程-1Oracle儲存過程
- 使用JavaScript和Python實現Oracle資料庫的儲存過程?JavaScriptPythonOracle資料庫儲存過程
- 使用SQL SERVER儲存過程實現歷史資料遷移SQLServer儲存過程
- 好程式設計師大資料培訓分享之hive儲存過程程式設計師大資料Hive儲存過程
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- mongo 儲存過程詳解Go儲存過程
- Sqlserver中的儲存過程SQLServer儲存過程
- SQL 分頁儲存過程SQL儲存過程
- 原創:oracle 儲存過程Oracle儲存過程
- jsp中呼叫儲存過程JS儲存過程
- 資料庫儲存過程資料庫儲存過程
- mybatis儲存過程返回listMyBatis儲存過程
- Mysql 儲存過程的使用MySql儲存過程
- mysql儲存過程及日期函式實踐MySql儲存過程函式
- MYSQL學習與實驗(八)——儲存過程實驗MySql儲存過程