集算器用作Java计算类库的应用结构

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

集算器封装了丰富的结构化文件计算函数,可读入格式复杂的文本,进行结构化文件计算,实现大文件游标计算,简化多线程并行计算。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调用。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航