国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

集算器協助java處理結構化文本的集合運算

2019-11-14 14:54:37
字體:
來源:轉載
供稿:網友

java不直接支持集合運算,因此要用嵌套循環才能實現文本文件之間的交集、并集、差集等集合運算,如果文件數量較多,或者文件較大而無法放入內存直接計算,再或者要按照多個字段進行集合運算,則相應的代碼會更加復雜。集算器直接支持集合運算,可以協助JAVA輕松實現此類算法,下面我們通過例子來看一下具體作法。

有兩個小文件:f1.txt和f2.txt,第一行是列名,現在需要對文件中的Name字段進行交集運算。部分數據如下:

文件f1.txt:

esProc_java_structured_setoperator_1

文件f2.txt:

esProc_java_structured_setoperator_2

集算器代碼:

esProc_java_structured_setoperator_3

A1、B1:用import函數將文件讀=[A1.(Name),B1.(Name)].isect()入內存,默認的分隔符是tab。這里的函數選項@t表示將第一行讀為列名,這樣一來后續的計算就可以直接用Name和Dept來引用相應的列,如果第一行不是列名,則應當用_1和_2這種默認列名來引用。

計算后A1和B1的值分別如下:

esProc_java_structured_setoperator_4

函數import可以讀取指定的列,比如本案例只有Name會參與計算,因此可以只讀取Name列,對應的代碼是:file(“E://f1.txt”).import@t(Name) 。

A2= 函數isect可以進行集合間的交集運算,A1.(Name)表示取出A1的Name列,形成一個集合,B1.(Name)表示取出B1的Name列。本案例的最終結果如下:

esProc_java_structured_setoperator_5

A3:result A2。這表示將計算結果輸出到JDBC接口。A3可以和A2合為一步:result [A1.(Name),B1.(Name)].isect() 。

上述是求交集的過程,求并集只需換個函數:[A1.(Name),B1.(Name)].union(),計算結果如下:

esProc_java_structured_setoperator_6

求差集的代碼:[A1.(Name),B1.(Name)].diff(),計算結果如下:

esProc_java_structured_setoperator_7

還有一類特殊的集合算法:和集,即求并集時保留重復的元素,和集的代碼:[A1.(Name),B1.(Name)].conj(),計算結果如下:

esProc_java_structured_setoperator_8

可以直接用運算符來代替函數,寫法更加簡潔,比如交集,并集、差集、合集可以改寫為:

    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) 。

計算結果如下:

esProc_java_structured_setoperator_9

對于內存放不下的大文件,可以用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();//獲得計算結果


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 文山县| 淳安县| 曲阜市| 香河县| 绍兴市| 晋宁县| 博罗县| 尚志市| 汉源县| 汉中市| 彩票| 涞源县| 崇礼县| 灌南县| 巫山县| 陆河县| 册亨县| 什邡市| 蓬溪县| 英超| 山丹县| 灯塔市| 长兴县| SHOW| 昆山市| 夏邑县| 厦门市| 河源市| 永丰县| 博罗县| 彝良县| 河源市| 枣强县| 新郑市| 江北区| 获嘉县| 靖西县| 呼图壁县| 丹巴县| 宣武区| 舞钢市|