自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

集算器協(xié)助java處理結(jié)構(gòu)化文本的集合運(yùn)算

開(kāi)發(fā) 后端
與內(nèi)存計(jì)算不同,操作游標(biāo)需要使用游標(biāo)函數(shù),比如排序時(shí)應(yīng)當(dāng)使用函數(shù)sortx。這里的merge函數(shù)使用了兩個(gè)函數(shù)選項(xiàng),@i表示求交集,@x表示參與計(jì)算的對(duì)象不是內(nèi)存數(shù)據(jù),而是游標(biāo)。另外,union等函數(shù)只能進(jìn)行內(nèi)存數(shù)據(jù)的集合運(yùn)算,不能用于大文件。

JAVA不直接支持集合運(yùn)算,因此要用嵌套循環(huán)才能實(shí)現(xiàn)文本文件之間的交集、并集、差集 等集合運(yùn)算,如果文件數(shù)量較多,或者文件較大而無(wú)法放入內(nèi)存直接計(jì)算,再或者要按照多個(gè)字段進(jìn)行集合運(yùn)算,則相應(yīng)的代碼會(huì)更加復(fù)雜。集算器直接支持集合運(yùn) 算,可以協(xié)助JAVA輕松實(shí)現(xiàn)此類算法,下面我們通過(guò)例子來(lái)看一下具體作法。

有兩個(gè)小文件:f1.txt和f2.txt,***行是列名,現(xiàn)在需要對(duì)文件中的Name字段進(jìn)行交集運(yùn)算。部分?jǐn)?shù)據(jù)如下:

文件f1.txt:

esProc_java_structured_setoperator_1

文件f2.txt:

esProc_java_structured_setoperator_2

集算器代碼:

esProc_java_structured_setoperator_3

A1、B1:用import函數(shù)將文件讀=[A1.(Name),B1.(Name)].isect()入內(nèi)存,默認(rèn)的分隔符是tab。這里的函數(shù) 選項(xiàng)@t表示將***行讀為列名,這樣一來(lái)后續(xù)的計(jì)算就可以直接用Name和Dept來(lái)引用相應(yīng)的列,如果***行不是列名,則應(yīng)當(dāng)用_1和_2這種默認(rèn)列名 來(lái)引用。

計(jì)算后A1和B1的值分別如下:

esProc_java_structured_setoperator_4

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

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

esProc_java_structured_setoperator_5

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

上述是求交集的過(guò)程,求并集只需換個(gè)函數(shù):[A1.(Name),B1.(Name)].union(),計(jì)算結(jié)果如下:

esProc_java_structured_setoperator_6

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

esProc_java_structured_setoperator_7

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

esProc_java_structured_setoperator_8

可以直接用運(yùn)算符來(lái)代替函數(shù),寫法更加簡(jiǎn)潔,比如交集,并集、差集、合集可以改寫為:

    A1.(Name) ^ B1.(Name)
     A1.(Name) & B1.(Name)
     A1.(Name) \ B1.(Name)
     A1.(Name) | B1.(Name)

也可以對(duì)多個(gè)文件進(jìn)行集合運(yùn)算,比如f1.txt、f2.txt、f3.txt讀入內(nèi)存后對(duì)應(yīng)的變量分別是A1、B1、C1,對(duì)它們求交集,代碼如 下:A1.(Name) ^ B1.(Name) ^C1.(Name) 或 [A1.(Name),B1.(Name),C1.(Name)].isect() 。

有時(shí)候文件比較大,會(huì)影響集合運(yùn)算的性能,可以用sort函數(shù)事先排序,再用merge函數(shù)來(lái)進(jìn)行集合運(yùn)算,這樣一來(lái)性能會(huì)顯著提高。其中,求交集時(shí)應(yīng)當(dāng)使用函數(shù)選項(xiàng)@i,并集使用@u,差集使用@d,對(duì)應(yīng)的代碼分別如下:

    =[A1.(Name).sort(),B1.(Name).sort()].merge@i()
     =[A1.(Name).sort(),B1.(Name).sort()].merge@u()
     =[A1.(Name).sort(),B1.(Name).sort()].merge@d()

函數(shù)merge還可以進(jìn)行多字段的集合運(yùn)算,假設(shè)不同的Dept會(huì)存在相同的Name,現(xiàn)在需要將Dept和Name當(dāng)作一個(gè)整體來(lái)進(jìn)行交集運(yùn)算, 對(duì)應(yīng)的代碼如下:[A1.sort(Dept,Name),B1.sort(Dept,Name)].merge@i(Dept,Name) 。

計(jì)算結(jié)果如下:

esProc_java_structured_setoperator_9

對(duì)于內(nèi)存放不下的大文件,可以用cursor函數(shù)來(lái)讀取文件,并用merge函數(shù)來(lái)實(shí)現(xiàn)集合運(yùn)算。其中,求交集的代碼如下:
    A1=file(“e:\\f1.txt”).cursor()
     B1=file(“e:\\f2.txt”).cursor()
     A2=[ A1.sortx(Name),B1.sortx(Name)].merge@xi(Name)

注意,這里函數(shù)cursor并不會(huì)將數(shù)據(jù)全部讀入內(nèi)存,而是以游標(biāo)(或流)的方式打開(kāi)文件。集算器引擎會(huì)自動(dòng)分配合適的緩沖區(qū),每次讀取一部分?jǐn)?shù)據(jù)參與計(jì)算,再循環(huán)往復(fù),完成最終的計(jì)算。

與內(nèi)存計(jì)算不同,操作游標(biāo)需要使用游標(biāo)函數(shù),比如排序時(shí)應(yīng)當(dāng)使用函數(shù)sortx。這里的merge函數(shù)使用了兩個(gè)函數(shù)選項(xiàng),@i表示求交集,@x表示參與計(jì)算的對(duì)象不是內(nèi)存數(shù)據(jù),而是游標(biāo)。另外,union等函數(shù)只能進(jìn)行內(nèi)存數(shù)據(jù)的集合運(yùn)算,不能用于大文件。

上述腳本已經(jīng)完成了所有的數(shù)據(jù)處理工作,接下來(lái)通過(guò)JDBC將集算器腳本集成在JAVA里。JAVA代碼如下:

  1. //建立esProc jdbc連接 
  2.  Class.forName(“com.esproc.jdbc.InternalDriver”); 
  3.  con= DriverManager.getConnection(“jdbc:esproc:local://”); 
  4.  //調(diào)用esProc,其中test是腳本文件名 
  5.  st =(com.esproc.jdbc.InternalCStatement)con.prepareCall(“call test()”); 
  6.  st.execute();//執(zhí)行esProc存儲(chǔ)過(guò)程 
  7.  ResultSet set = st.getResultSet();//獲得計(jì)算結(jié)果 

 

責(zé)任編輯:王雪燕 來(lái)源: 博客園
相關(guān)推薦

2015-12-08 13:53:56

java結(jié)構(gòu)對(duì)齊連接

2015-12-18 10:10:06

集算器Java結(jié)構(gòu)化

2014-03-14 09:52:15

非結(jié)構(gòu)化數(shù)據(jù)

2021-12-12 08:37:18

結(jié)構(gòu)化數(shù)據(jù)非結(jié)構(gòu)化數(shù)據(jù)數(shù)據(jù)

2021-12-29 10:51:19

JavaSPL架構(gòu)

2024-10-08 10:57:04

2024-05-27 00:32:45

2018-04-03 14:00:03

結(jié)構(gòu)化數(shù)據(jù)非結(jié)構(gòu)化數(shù)據(jù)數(shù)據(jù)庫(kù)

2017-12-06 15:46:31

深度學(xué)習(xí)結(jié)構(gòu)化數(shù)據(jù)NLP

2023-06-19 07:08:22

結(jié)構(gòu)化數(shù)據(jù)ChatGPT

2023-12-25 15:00:18

結(jié)構(gòu)化布線光纖

2022-05-24 09:52:37

Spark SQL大數(shù)據(jù)處理Hive

2012-02-08 15:54:05

ibmdw

2010-01-13 13:20:08

VB.NET結(jié)構(gòu)化異常

2023-12-26 09:00:00

Java結(jié)構(gòu)化并發(fā)開(kāi)發(fā)

2017-05-16 21:31:03

結(jié)構(gòu)化數(shù)據(jù)新模式

2011-03-01 13:59:43

結(jié)構(gòu)化

2009-10-09 17:57:20

結(jié)構(gòu)化布線

2011-02-28 13:55:00

結(jié)構(gòu)化布線

2022-01-04 05:40:17

Whispers安全工具靜態(tài)代碼分析
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)