集算器封裝了豐富的結構化文件計算函數,可讀入格式復雜的文本,進行結構化文件計算,實現大文件游標計算,簡化多線程并行計算。java應用程序可以將集算器腳本文件當做數據庫存儲過程執行,傳入參數并用JDBC獲得返回結果。
集算器與Java應用程序的集成結構如下:
下面舉例說明Java集成集算器的一般方法。
文件sOrder.txt是tab分隔的文本文件,存儲著一批訂單信息。要求用JAVA對該文件進行條件查詢,返回指定時間段內的訂單。
sOrder.txt部分數據如下:
步驟一:在集算器IDE中完成算法
A1:讀入文件。默認分隔符是tab,@t表示將第一行讀為列頭。
A2:執行條件查詢。startDate和endDate是來自JAVA的參數,比如2010-01-01至2010-12-31。
步驟二:在集算器IDE中查看計算結果
點擊A2可驗證計算結果:
步驟三:在JAVA中集成集算器腳本
JAVA主程序可以JDBC的方式調用集算器腳本,代碼如下:
Class.forName(“com.esPRoc.jdbc.InternalDriver”);
con= DriverManager.getConnection(“jdbc:esproc:local://”);
//調用集算器腳本(類似存儲過程),其中orderQuery是dfx的文件名
st =(com. esproc.jdbc.InternalCStatement)con.prepareCall(“call orderQuery (?,?)”);
st.setObject(1,”2010-01-01″);
st.setObject(2,”2010-12-31″);
//執行腳本
st.execute();
//獲取結果集
ResultSet rs = st.getResultSet();
……
集算器默認返回最后一個單元格,也可用return語句返回指定單元格。返回值是符合JDBC標準的ResultSet對象,調用集算器腳本和訪問數據庫的方法完全一樣,熟悉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對象執行腳本,以便進行參數類型強制轉換。prepareStatement里的參數占位符在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();
大返回值
有時候計算結果會超出內存,這時就要用集算器游標函數返回結果,相應的JAVA要使用JDBC流來訪問。比如:按時間段查詢大文件sOrderBig.txt,集算器代碼如下:
函數cursor以游標方式打開大文件,函數select的查詢結果也是游標。
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);//設置每批次讀取的記錄數。
st.execute();
ResultSet rs = st.getResultSet();
while (rs.next()) {
……
}
涉及數據庫
如果計算時涉及數據庫,可在集算器中完成計算,并用集算器JDBC統一返回,而不必在JAVA中單獨集成數據庫。比如下面的代碼可將數據庫表emp對齊到sOrder.txt中。
關于在集算器中訪問數據庫請參考集算器輔助SQL編寫的應用結構,JAVA集成集算器請參考集算器集成應用之被JAVA調用。
新聞熱點
疑難解答