您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關集算器協助java處理結構化文本的集合運算是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
JAVA不直接支持集合運算,因此要用嵌套循環才能實現文本文件之間的交集、并集、差集 等集合運算,如果文件數量較多,或者文件較大而無法放入內存直接計算,再或者要按照多個字段進行集合運算,則相應的代碼會更加復雜。集算器直接支持集合運 算,可以協助JAVA輕松實現此類算法,下面我們通過例子來看一下具體作法。
有兩個小文件:f1.txt和f2.txt,***行是列名,現在需要對文件中的Name字段進行交集運算。部分數據如下:
文件f1.txt:
文件f2.txt:
集算器代碼:
A1、B1:用import函數將文件讀=[A1.(Name),B1.(Name)].isect()入內存,默認的分隔符是tab。這里的函數 選項@t表示將***行讀為列名,這樣一來后續的計算就可以直接用Name和Dept來引用相應的列,如果***行不是列名,則應當用_1和_2這種默認列名 來引用。
計算后A1和B1的值分別如下:
函數import可以讀取指定的列,比如本案例只有Name會參與計算,因此可以只讀取Name列,對應的代碼是:file(“E:\\f1.txt”).import@t(Name) 。
A2= 函數isect可以進行集合間的交集運算,A1.(Name)表示取出A1的Name列,形成一個集合,B1.(Name)表示取出B1的Name列。本案例的最終結果如下:
A3:result A2。這表示將計算結果輸出到JDBC接口。A3可以和A2合為一步:result [A1.(Name),B1.(Name)].isect() 。
上述是求交集的過程,求并集只需換個函數:[A1.(Name),B1.(Name)].union(),計算結果如下:
求差集的代碼:[A1.(Name),B1.(Name)].diff(),計算結果如下:
還有一類特殊的集合算法:和集,即求并集時保留重復的元素,和集的代碼:[A1.(Name),B1.(Name)].conj(),計算結果如下:
可以直接用運算符來代替函數,寫法更加簡潔,比如交集,并集、差集、合集可以改寫為:
A1.(Name) ^ B1.(Name)
A1.(Name) & B1.(Name)
A1.(Name) \ B1.(Name)
A1.(Name) | B1.(Name)
也可以對多個文件進行集合運算,比如f1.txt、f2.txt、f3.txt讀入內存后對應的變量分別是A1、B1、C1,對它們求交集,代碼如 下:A1.(Name) ^ B1.(Name) ^C1.(Name) 或 [A1.(Name),B1.(Name),C1.(Name)].isect() 。
有時候文件比較大,會影響集合運算的性能,可以用sort函數事先排序,再用merge函數來進行集合運算,這樣一來性能會顯著提高。其中,求交集時應當使用函數選項@i,并集使用@u,差集使用@d,對應的代碼分別如下:
=[A1.(Name).sort(),B1.(Name).sort()].merge@i()
=[A1.(Name).sort(),B1.(Name).sort()].merge@u()
=[A1.(Name).sort(),B1.(Name).sort()].merge@d()
函數merge還可以進行多字段的集合運算,假設不同的Dept會存在相同的Name,現在需要將Dept和Name當作一個整體來進行交集運算, 對應的代碼如下:[A1.sort(Dept,Name),B1.sort(Dept,Name)].merge@i(Dept,Name) 。
計算結果如下:
對于內存放不下的大文件,可以用cursor函數來讀取文件,并用merge函數來實現集合運算。其中,求交集的代碼如下:
A1=file(“e:\\f1.txt”).cursor()
B1=file(“e:\\f2.txt”).cursor()
A2=[ A1.sortx(Name),B1.sortx(Name)].merge@xi(Name)
注意,這里函數cursor并不會將數據全部讀入內存,而是以游標(或流)的方式打開文件。集算器引擎會自動分配合適的緩沖區,每次讀取一部分數據參與計算,再循環往復,完成最終的計算。
與內存計算不同,操作游標需要使用游標函數,比如排序時應當使用函數sortx。這里的merge函數使用了兩個函數選項,@i表示求交集,@x表示參與計算的對象不是內存數據,而是游標。另外,union等函數只能進行內存數據的集合運算,不能用于大文件。
上述腳本已經完成了所有的數據處理工作,接下來通過JDBC將集算器腳本集成在JAVA里。JAVA代碼如下:
//建立esProc jdbc連接 Class.forName(“com.esproc.jdbc.InternalDriver”); con= DriverManager.getConnection(“jdbc:esproc:local://”); //調用esProc,其中test是腳本文件名 st =(com.esproc.jdbc.InternalCStatement)con.prepareCall(“call test()”); st.execute();//執行esProc存儲過程 ResultSet set = st.getResultSet();//獲得計算結果
看完上述內容,你們對集算器協助java處理結構化文本的集合運算是怎樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。