集算器封装了丰富的结构化文件计算函数,可读入格式复杂的文本,进行结构化文件计算,实现大文件游标计算,简化多线程并行计算。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() ” + “=A1.select(OrderDate>=date(”2010-01-01”) && OrderDate<=date(”2010-12-31”))”);
可以看到,行和行之间只需用回车“ “来分隔(列之间用 分隔)。
也可以使用prepareStatement对象执行脚本,以便进行参数类型强制转换。prepareStatement里的参数占位符在SQL中是问号,但问号是集算器的保留符号,因此要用”arg1,arg2,arg3”的形式依次占位,代码如下:
st= (com. esproc.jdbc.InternalCStatement)con.prepareStatement(“=file(”D:\sOrder.txt”).import@t() ” + “=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调用。