中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java嵌入數據引擎從SQLite到SPL實例分析

發布時間:2022-07-28 10:03:55 來源:億速云 閱讀:141 作者:iii 欄目:開發技術

本篇內容主要講解“Java嵌入數據引擎從SQLite到SPL實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java嵌入數據引擎從SQLite到SPL實例分析”吧!

可以在Java應用中嵌入的數據引擎看起來比較豐富,但其實并不容易選擇。Redis計算能力很差,只適合簡單查詢的場景。Spark架構復雜沉重,部署維護很是麻煩。H2\HSQLDB\Derby等內嵌數據庫倒是架構簡單,但計算能力又不足,連基本的窗口函數都不支持。

相比之下,SQLite在架構性和計算能力上取得了較好的平衡,是應用較廣的Java嵌入數據引擎。

SQLite適應常規基本應用場景

SQLite架構簡單,其核心雖然是C語言開發的,但封裝得比較好,對外呈現為一個小巧的Jar包,能方便地集成在Java應用中。SQLite提供了JDBC接口,可以被Java調用:

Connection connection = DriverManager.getConnection("jdbc:sqlite::memory:");
Statement st = connection.createStatement();
st.execute("restore from d:/ex1");
ResultSet rs = st.executeQuery("SELECT * FROM orders");

SQLite提供了標準的SQL語法,常規的數據處理和計算都沒有問題。特別地,SQLite已經能支持窗口函數,可以方便地實現很多組內運算,計算能力比其他內嵌數據庫更強。

SELECT x, y, row_number() OVER (ORDER BY y) AS row_number FROM t0 ORDER BY x;
SELECT a, b, group_concat(b, '.') OVER ( ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS group_concat FROM t1;

SQLite面對復雜場景尚有不足

SQLite的優點亮眼,但對于復雜應用場景時還是有些缺點。

Java應用可能處理的數據源多種多樣,比如csv文件、RDB、Excel、Restful,但SQLite只處理了簡單情況,即對csv等文本文件提供了直接可用的命令行加載程序:

.import --csv --skip 1 --schema temp /Users/scudata/somedata.csv tab1

對于其他大部分數據源,SQLite都沒有提供方便的接口,只能硬寫代碼加載數據,需要多次調用命令行,整個過程很繁瑣,時效性也差。

以加載RDB數據源為例,一般的做法是先用Java執行命令行,把RDB庫表轉為csv;再用JDBC訪問SQLite,創建表結構;之后用Java執行命令行,將csv文件導入SQLite;最后為新表建索引,以提高性能。這個方法比較死板,如果想靈活定義表結構和表名,或通過計算確定加載的數據,代碼就更難寫了。

類似地,對于其他數據源,SQLite也不能直接加載,同樣要通過繁瑣地轉換過程才可以。

SQL接近自然語言,學習門檻低,容易實現簡單的計算,但不擅長復雜的計算,比如復雜的集合計算、有序計算、關聯計算、多步驟計算。SQLite采用SQL語句做計算,SQL優點和缺點都會繼承下來,勉強實現這些復雜計算的話,代碼會顯得繁瑣難懂。

比如,某只股票最長的上漲天數,SQL要這樣寫:

select max(continuousDays)-1
from (select count(*) continuousDays
from (select sum(changeSign) over(order by tradeDate) unRiseDays
from (select tradeDate,
case when price>lag(price) over(order by tradeDate) then 0 else 1 end changeSign from AAPL) )
group by unRiseDays)

這也不單是SQLite的難題,事實上,由于集合化不徹底、缺乏序號、缺乏對象引用等原因,其他SQL數據庫也不擅長這些運算。

業務邏輯由結構化數據計算和流程控制組成,SQLite支持SQL,具有結構化數據計算能力,但SQLite沒有提供存儲過程,不具備獨立的流程控制能力,也就不能實現一般的業務邏輯,通常要利用Java主程序的判斷和循環語句。由于Java沒有專業的結構化數據對象來承載SQLite數據表和記錄,轉換過程麻煩,處理過程不暢,開發效率不高。

前面提過,SQLite內核是C程序,雖然可以被集成到Java應用中,但并不能和Java無縫集成,和Java主程序交換數據時要經過耗時的轉換才能完成,在涉及數據量較大或交互頻繁時性能就會明顯不足。同樣因為內核是C程序,SQLite會在一定程度上破壞Java架構的一致性和健壯性。

對于Java應用來講,原生在JVM上的esProc SPL是更好的選擇。

SPL全面支持各種數據源

esProc SPL是JVM下開源的嵌入數據引擎,架構簡單,可直接加載數據源,可以通過JDBC接口被Java集成調用,并方便地進行后續計算。

SPL架構簡單,無須獨立服務,只要引入SPL的Jar包,就可以部署在Java環境中。

直接加載數據源,代碼簡短,過程簡單,時效性強。比如加載Oracle:

A
1=connect("orcl")
2=A1.query@x("select OrderID,Client,SellerID,OrderDate,Amount from orders order by OrderID")
3>env(orders,A2)

對于SQLite擅長加載的csv文件,SPL也可以直接加載,使用內置函數而不是外部命令行,穩定且效率高,代碼更簡短:

=T("/Users/scudata/somedata.csv")

多種外部數據源。除了RDB和csv,SPL還直接支持txt\xls等文件,MongoDB、Hadoop、redis、ElasticSearch、Kafka、Cassandra等NoSQL,以及WebService XML、Restful Json等多層數據。比如,將HDSF里的文件加載到內存:

A
1=hdfs_open(;"hdfs://192.168.0.8:9000")
2=hdfs_file(A1,"/user/Orders.csv":"GBK")
3=A2.cursor@t()
4=hdfs_close(A1)
5>env(orders,A4)

JDBC接口可以方便地集成。加載的數據量一般比較大,通常在應用的初始階段運行一次,只須將上面的加載過程存為SPL腳本文件,在Java中以存儲過程的形式引用腳本文件名:

Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
CallableStatement statement = conn.prepareCall("{call init()}");
statement.execute();

SPL的計算能力更強大

SPL提供了豐富的計算函數,可以輕松實現日常計算。SPL支持多種高級語法,大量的日期函數和字符串函數,很多用SQL難以表達的計算,用SPL都可以輕松實現,包括復雜的有序計算、集合計算、分步計算、關聯計算,以及帶流程控制的業務邏輯。

豐富的計算函數。SPL可以輕松實現各類日常計算:

 AB
1=Orders.find(arg_OrderIDList)//多鍵值查找
2=Orders.select(Amount>1000 && like(Client,\"*S*\"))//模糊查詢
3= Orders.sort(Client,-Amount)//排序
4= Orders.id(Client)//去重
5=join(Orders:O,SellerId; Employees:E,EId).new(O.OrderID, O.Client,O.Amount,E.Name,E.Gender,E.Dept)//關聯

標準SQL語法。SPL也提供了SQL-92標準的語法,比如分組匯總:

$select year(OrderDate) y,month(OrderDate) m, sum(Amount) s,count(1) c
from {Orders}
Where Amount>=? and Amount<? ;arg1,arg2

函數選項、層次參數等方便的語法。功能相似的函數可以共用一個函數名,只用函數選項區分差別,比SQL更加靈活方便。比如select函數的基本功能是過濾,如果只過濾出符合條件的第1條記錄,可使用選項@1:

T.select@1(Amount>1000)

二分法排序,即對有序數據用二分法進行快速過濾,使用@b:

T.select@b(Amount>1000)

有序分組,即對分組字段有序的數據,將相鄰且字段值相同的記錄分為一組,使用@b:

T.groups@b(Client;sum(Amount))

函數選項還可以組合搭配,比如:

Orders.select@1b(Amount>1000)

結構化運算函數的參數有些很復雜,比如SQL就需要用各種關鍵字把一條語句的參數分隔成多個組,但這會動用很多關鍵字,也使語句結構不統一。SPL使用層次參數簡化了復雜參數的表達,即通過分號、逗號、冒號自高而低將參數分為三層:

join(Orders:o,SellerId ; Employees:e,EId)

更豐富的日期和字符串函數。除了常見函數,比如日期增減、截取字符串,SPL還提供了更豐富的日期和字符串函數,在數量和功能上遠遠超過了SQL,同樣運算時代碼更短。比如:

季度增減:elapse@q(“2020-02-27”,-3) //返回2019-05-27

N個工作日之后的日期:workday(date(“2022-01-01”),25) //返回2022-02-04

字符串類函數,判斷是否全為數字:isdigit(“12345”) //返回true

取子串前面的字符串:substr@l(“abCDcdef”,“cd”) //返回abCD

按豎線拆成字符串數組:“aa|bb|cc”.split(“|”) //返回[“aa”,“bb”,“cc”]

SPL還支持年份增減、求季度、按正則表達式拆分字符串、拆出SQL的where或select部分、拆出單詞、按標記拆HTML等大量函數。

簡化有序運算。涉及跨行的有序運算,通常都有一定的難度,比如比上期和同期比。SPL使用"字段[相對位置]"引用跨行的數據,可顯著簡化代碼,還可以自動處理數組越界等特殊情況,比SQL窗口函數更加方便。比如,追加一個計算列rate,計算每條訂單的金額增長率:

=T.derive(AMOUNT/AMOUNT[-1]-1: rate)

綜合運用位置表達式和有序函數,很多SQL難以實現的有序運算,都可以用SPL輕松解決。比如,根據考勤表,找出連續 4 周每天均出勤達 7 小時的學生:

 A
1=Student.select(DURATION>=7).derive(pdate@w(ATTDATE):w)
2=A1.group@o(SID;~.groups@o(W;count(~):CNT).select(CNT==7).group@i(W-W[-1]!=7).max(~.len()):weeks)
3=A2.select(weeks>=4).(SID)

簡化集合運算,SPL的集合化更加徹底,配合靈活的語法和強大的集合函數,可大幅簡化復雜的集合計算。比如,在各部門找出比本部門平均年齡小的員工:

A
1=Employees.group(DEPT; (a=~.avg(age(BIRTHDAY)),~.select(age(BIRTHDAY)<a)):YOUNG)
2=A1.conj(YOUNG)

計算某支股票最長的連續上漲天數:

 A
1=a=0,AAPL.max(a=if(price>price[-1],a+1,0))

簡化關聯計算。SPL支持對象引用的形式表達關聯,可以通過點號直觀地訪問關聯表,避免使用JOIN導致的混亂繁瑣,尤其適合復雜的多層關聯和自關聯。比如,根據員工表計算女經理的男員工:

=employees.select(gender:"male",dept.manager.gender:"female")

方便的分步計算,SPL集合化更加徹底,可以用變量方便地表達集合,適合多步驟計算,SQL要用嵌套表達的運算,用SPL可以更輕松實現。比如,找出銷售額累計占到一半的前n個大客戶,并按銷售額從大到小排序:

AB
2=sales.sort(amount:-1)/銷售額逆序排序,可在SQL中完成
3=A2.cumulate(amount)/計算累計序列
4=A3.m(-1)/2/最后的累計即總額
5=A3.pselect(~>=A4)/超過一半的位置
6=A2(to(A5))/按位置取值

流程控制語法。SPL提供了流程控制語句,配合內置的結構化數據對象,可以方便地實現各類業務邏輯。

分支判斷語句:

 AB
2&hellip; 
3if T.AMOUNT>10000=T.BONUS=T.AMOUNT*0.05
4else if T.AMOUNT>=5000 && T.AMOUNT<10000=T.BONUS=T.AMOUNT*0.03
5else if T.AMOUNT>=2000 && T.AMOUNT<5000=T.BONUS=T.AMOUNT*0.02

循環語句:

 AB
1=db=connect("db") 
2=T=db.query@x("select * from sales where SellerID=? order by OrderDate",9)
3for T=A3.BONUS=A3.BONUS+A3.AMOUNT*0.01
4 =A3.CLIENT=CONCAT(LEFT(A3.CLIENT,4), " co.,ltd.")
5  &hellip;

與Java的循環類似,SPL還可用break關鍵字跳出(中斷)當前循環體,或用next關鍵字跳過(忽略)本輪循環,不展開說了。

計算性能更好。在內存計算方面,除了常規的主鍵和索引外,SPL還提供了很多高性能的數據結構和算法支持,比大多數使用SQL的內存數據庫性能好得多,且占用內存更少,比如預關聯技術、并行計算、指針式復用。

優化體系結構

SPL支持JDBC接口,代碼可外置于Java,耦合性更低,也可內置于Java,調用更簡單。SPL支持解釋執行和熱切換,代碼方便移植和管理運營,支持內外存混合計算。

外置代碼耦合性低。SPL代碼可外置于Java,通過文件名被調用,既不依賴數據庫,也不依賴Java,業務邏輯和前端代碼天然解耦。

對于較短的計算,也可以像SQLite那樣合并成一句,寫在Java代碼中:

Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
Statement statement = conn.createStatement();
String arg1="1000";
String arg2="2000"
ResultSet result = statement.executeQuery(=Orders.select(Amount>="+arg1+" && Amount<"+arg2+"). groups(year(OrderDate):y,month(OrderDate):m; sum(Amount):s,count(1):c)");

解釋執行和熱切換。業務邏輯數量多,復雜度高,變化是常態。良好的系統構架,應該有能力應對變化的業務邏輯。SPL是基于Java的解釋型語言,無須編譯就能執行,腳本修改后立即生效,支持不停機的熱切換,適合應對變化的業務邏輯。

方便代碼移植。SPL通過數據源名從數據庫取數,如果需要移植,只要改動配置文件中的數據源配置信息,而不必修改SPL代碼。SPL支持動態數據源,可通過參數或宏切換不同的數據庫,從而進行更方便的移植。為了進一步增強可移植性,SPL還提供了與具體數據庫無關的標準SQL語法,使用sqltranslate函數可將標準SQL轉為主流方言SQL,仍然通過query函數執行。

方便管理運營。由于支持庫外計算,代碼可被第三方工具管理,方便團隊協作;SPL腳本可以按文件目錄進行存放,方便靈活,管理成本低;SPL對數據庫的權限要求類似Java,不影響數據安全。

內外存混合計算。有些數據太大,無法放入內存,但又要與內存表共同計算,這種情況可利用SPL實現內外存混合計算。比如,主表orders已加載到內存,大明細表orderdetail是文本文件,下面進行主表和明細表的關聯計算:

 A
1=file("orderdetail.txt").cursor@t()
2=orders.cursor()
3=join(A1:detail,orderid ; A2:main,orderid)
4=A3.groups(year(main.orderdate):y; sum(detail.amount):s)

SQLite使用簡單方便,但數據源加載繁瑣,計算能力不足。SPL架構也非常簡單,并直接支持更多數據源。SPL計算能力強大,提供了豐富的計算函數,可以輕松實現SQL不擅長的復雜計算。SPL還提供多種優化體系結構的手段,代碼既可外置也可內置于Java,支持解釋執行和熱切換,方便移植和管理運營,并支持內外存混合計算。

到此,相信大家對“Java嵌入數據引擎從SQLite到SPL實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴东县| 海安县| 宁蒗| 左贡县| 福州市| 宜春市| 甘泉县| 云浮市| 潢川县| 海原县| 贵定县| 枣阳市| 晋州市| 鱼台县| 安义县| 太仆寺旗| 景泰县| 梓潼县| 鹿邑县| 教育| 九龙县| 铁力市| 弋阳县| 称多县| 田东县| 安化县| 大方县| 密云县| 津南区| 南和县| 黄骅市| 闻喜县| 定边县| 威远县| 岗巴县| 文登市| 东光县| 铜川市| 五常市| 乳源| 上杭县|