集算器封裝了豐富的結(jié)構(gòu)化文件計算函數(shù),可讀入格式復(fù)雜的文本,進行結(jié)構(gòu)化文件計算,實現(xiàn)大文件游標計算,簡化多線程并行計算。java應(yīng)用程序可以將集算器腳本文件當(dāng)做數(shù)據(jù)庫存儲過程執(zhí)行,傳入?yún)?shù)并用JDBC獲得返回結(jié)果。
集算器與Java應(yīng)用程序的集成結(jié)構(gòu)如下:
下面舉例說明Java集成集算器的一般方法。
文件sOrder.txt是tab分隔的文本文件,存儲著一批訂單信息。要求用JAVA對該文件進行條件查詢,返回指定時間段內(nèi)的訂單。
sOrder.txt部分數(shù)據(jù)如下:
步驟一:在集算器IDE中完成算法
A1:讀入文件。默認分隔符是tab,@t表示將第一行讀為列頭。
A2:執(zhí)行條件查詢。startDate和endDate是來自JAVA的參數(shù),比如2010-01-01至2010-12-31。
步驟二:在集算器IDE中查看計算結(jié)果
點擊A2可驗證計算結(jié)果:
步驟三:在JAVA中集成集算器腳本
JAVA主程序可以JDBC的方式調(diào)用集算器腳本,代碼如下:
Class.forName(“com.esPRoc.jdbc.InternalDriver”);
con= DriverManager.getConnection(“jdbc:esproc:local://”);
//調(diào)用集算器腳本(類似存儲過程),其中orderQuery是dfx的文件名
st =(com. esproc.jdbc.InternalCStatement)con.prepareCall(“call orderQuery (?,?)”);
st.setObject(1,”2010-01-01″);
st.setObject(2,”2010-12-31″);
//執(zhí)行腳本
st.execute();
//獲取結(jié)果集
ResultSet rs = st.getResultSet();
……
集算器默認返回最后一個單元格,也可用return語句返回指定單元格。返回值是符合JDBC標準的ResultSet對象,調(diào)用集算器腳本和訪問數(shù)據(jù)庫的方法完全一樣,熟悉JDBC的程序員可以很快掌握。
上面的例子說明了JAVA集成集算器的一般方法,下面說明幾種特殊情況。
簡單腳本無文件
集算器腳本比較簡單時,可以將腳本直接寫在JAVA中,而不必專門存儲一個腳本文件。比如前面的例子可以寫作:
st = (com. esproc.jdbc.InternalCStatement)con.createStatement();
ResultSet rs1 = st.executeQuery(“=file(/”D://sOrder.txt/”).import@t()/n” + “=A1.select(OrderDate>=date(/”2010-01-01/”) && OrderDate<=date(/”2010-12-31/”))”);
可以看到,行和行之間只需用回車“/n“來分隔(列之間用/t分隔)。
也可以使用prepareStatement對象執(zhí)行腳本,以便進行參數(shù)類型強制轉(zhuǎn)換。prepareStatement里的參數(shù)占位符在SQL中是問號,但問號是集算器的保留符號,因此要用”arg1,arg2,arg3”的形式依次占位,代碼如下:
st= (com. esproc.jdbc.InternalCStatement)con.prepareStatement(“=file(/”D://sOrder.txt/”).import@t()/n” + “=A1.select(OrderDate>=arg1 && OrderDate<=arg2)”);
java.util.Date dateBegin = new SimpleDateFormat(“yyyy-MM-dd”).parse(“2010-01-01″);
java.sql.Date sqlDateBegin = new java.sql.Date(dateBegin.getTime());
java.util.Date dateEnd = new SimpleDateFormat(“yyyy-MM-dd”).parse(“2010-12-31″);
java.sql.Date sqlDateEnd = new java.sql.Date(dateEnd .getTime());
st.setDate(1, sqlDateBegin);
st.setDate(2, sqlDateEnd );
ResultSet rs1 = st.executeQuery();
大返回值
有時候計算結(jié)果會超出內(nèi)存,這時就要用集算器游標函數(shù)返回結(jié)果,相應(yīng)的JAVA要使用JDBC流來訪問。比如:按時間段查詢大文件sOrderBig.txt,集算器代碼如下:
函數(shù)cursor以游標方式打開大文件,函數(shù)select的查詢結(jié)果也是游標。
JAVA集成集算器的代碼如下:
st =(com. esproc.jdbc.InternalCStatement)con.prepareCall(“call orderBigQuery (?,?)”);
st.setObject(1,”2010-01-01″);
st.setObject(2,”2010-12-31″);
st.setFetchSize(1000);//設(shè)置每批次讀取的記錄數(shù)。
st.execute();
ResultSet rs = st.getResultSet();
while (rs.next()) {
……
}
涉及數(shù)據(jù)庫
如果計算時涉及數(shù)據(jù)庫,可在集算器中完成計算,并用集算器JDBC統(tǒng)一返回,而不必在JAVA中單獨集成數(shù)據(jù)庫。比如下面的代碼可將數(shù)據(jù)庫表emp對齊到sOrder.txt中。
關(guān)于在集算器中訪問數(shù)據(jù)庫請參考集算器輔助SQL編寫的應(yīng)用結(jié)構(gòu),JAVA集成集算器請參考集算器集成應(yīng)用之被JAVA調(diào)用。
新聞熱點
疑難解答