集算器用作Java结构化文件计算类库

有时我们不能使用数据库而采用文件系统存储数据,这时就需要自行完成基于文件的数据计算。但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差。在网上有许多寻找用于文件计算的Java类库的问题,如:

http://www.coderanch.com/t/561180/java/java/read-text-file-perform-operation

http://stackoverflow.com/questions/9614112/how-to-sort-and-arrange-a-text-file-in-java-to-group-lines

http://stackoverflow.com/questions/26418282/get-text-file-through-sql-java

http://www.linkedin.com/groups/I-would-like-desing-DAO-70526.S.5927393719350235139?trk=groups_search_item_list-0-b-ttl&goback=%2Egna_70526

https://plus.google.com/112275790033275716955/posts/4p75NJYzMcv

http://stackoverflow.com/questions/28969897/file-based-datastructure-for-java

使用免费的集算器可以弥补这一不足。集算器封装了丰富的结构化文件计算函数,并提供JDBC接口。JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果。

集算器与Java应用程序的集成结构如下:

下面以文本文件的条件查询为例说明Java调用集算器完成结构化文件计算的过程。源数据如下:

        条件查询:选出某时间段内的订单。

代码:

解释:

A1:读入文件。默认分隔符是tab,@t表示将第一行读为列头。

A2:执行条件查询。startDate和endDate是输入参数,比如2010-01-01至2010-12-31。结果:

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();

//获取结果集

ResultSetrs = st.getResultSet();

……

返回值是符合JDBC标准的ResultSet对象,调用集算器脚本和访问数据库的方法完全一样,熟悉JDBC的程序员可以很快掌握。

对于上面这类较简单的代码,还可以直接将脚本写在JDBC调用中,多行语句之间用\n分隔即可,类似执行一句较复杂的SQL,这样可以不必再保存一个脚本文件。

st = (com.esproc.jdbc.InternalCStatement)con.createStatement();

ResultSet rs1 =st.executeQuery("=file(\"D:\\sOrder.txt\")[email protected]()\n"
+ "=A1.select(OrderDate>=date(\"2010-01-01\")&& OrderDate<=date(\"2010-12-31\"))");

集算器会返回最后一个表达式的值。

关于集算器JDBC的部署和调用的更详细信息可参考【集算器集成应用之被JAVA调用

作为专业的结构化计算类库,集算器还可以实现更多运算,下面分别举例。

        排序:按照客户代码降序排序,按照年、月升序排序。

代码:=A1.sort(-Client,year(OrderDate),month(OrderDate))

解释:降序排列使用“-”,年、月需要计算获得。

引申:如果要在查询的基础上排序,可以写作=A2.sort(…),或者=A1.select(…).sort(…)

结果:

        分组汇总:计算出每个销售员每年的销售额和订单数

代码:=A1.groups(SellerId,year(OrderDate);sum(Amount),count(~))

解释:函数group可在分组的同时进行汇总,~表示每组或当前组,count(~)等于count(OrderID)。

结果:

        获得唯一值:列出客户名单

代码:=A1.id(Client)

结果:

        去除重复:保留每个客户每个销售的第一条记录

代码:[email protected](Client,SellerId)

解释:函数group用来分组(可以不汇总),@1表示每组取第1条记录。

结果:

        TopN:找到每个销售员销售额最大的3笔订单。

代码:=A1.group(SellerId;~.top(3,-Amount):t).conj(t)

解释:函数top过滤出TopN,”-”表示逆序,函数conj用于合并。

引申:如果只取最大的一笔订单,可以用maxp函数。

计算结果:

        关联计算:将emp.txt的Name、Dept、Gender这三个字段对齐到sOrder.txt。

代码:

解释:

A3:函数join执行连接运算,并将两个表改名为s和e,@1表示左连接。结果如下:

引申:@1表示左链接,@f表示全连接内连接无选项。

A4:从连接的表中取得需要的字段,组成新的结构化二维表格。

结果:

前面的例子假定文件较小,如果文件较大无法放入内存,可用集算器游标进行计算,详情参考相关文档。

值得一提的是,上述这些集算器的功能都是免费的,程序员可以无成本地将集算器引擎嵌入到自己的应用程序中。

时间: 2024-12-09 20:03:25

集算器用作Java结构化文件计算类库的相关文章

用集算器协助Java读入文本

JAVA提供了最基本的文件处理函数,可以简单无结构的方式读入小文本文件,如果遇到需要结构化.格式多样.要求特殊的文件或内存装不下的大文件,相应的代码就会很复杂,可读性和复用性也很难保障. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化文件读写和计算函数,并提供JDBC接口.JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果.详情参考集算器用作Java计算类库的应用结构. 下面说明JAVA读入文本的常见案例,以及集算器对应的解法. 读入指定列 

集算器协助Java处理结构化文本之分组汇总

直接用Java实现文体文件分组汇总会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当分组.汇总表达式变化时,只能改写代码.而要实现灵活表达式的话,需要自己实现动态表达式解析和求值,编程工作量非常大. 2.遍历过程中记录分组结果,结果小了还可以存在内存中,如果分组结果太大时要将中间结果缓存进临时文件再归并,实现过程非常复杂. 使用集算器辅助Java编程,这些问题都有现成的类库可以解决.下面,我们通过例子来看一下具体作法. 文本文件employee.txt中保存有员工信息,我们要按照DEPT

集算器协助Java处理结构化文本之条件过滤

直接用Java实现文本文件中数据按条件过滤会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当过滤条件变化时需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 2.文件太大时不能一次性装入内存处理,而采用逐步读入方式在考虑到性能时又会涉及到文件缓冲区管理.拆行计算等复杂编程. 使用集算器来辅助Java编程,这些问题都不需要自己写代码解决.下面我们通过例子来看一下具体作法. 文本文件employee.txt中保存了员工数据.我们要读取员

集算器协助Java处理多样性数据源之Hive

Java使用jdbc连接Hive比较简单,但是Hive的计算能力相对于其它数据库的SQL而言较弱,要完成非常规的计算需要将数据取出后用Java进一步计算,编程比较麻烦. 使用集算器配合Java编程,可以减少Java使用Hive时要进行复杂计算工作量.下面我们通过例子来看一下具体作法:Hive中的orders表中保存了订单的明细数据,需要计算同期比和比上期.数据如下: ORDERID CLIENT SELLERID AMOUNT ORDERDATE    1 UJRNP 17 392 2008/1

集算器协助java处理结构化文本之数据读入

JAVA只提供了指定分割符等最基本的数据读入功能,而其他常见功能都需要自己从底层去实现,比如:按列名读入指定列.指定列的次序.指定数据类型.无分割符等等.JAVA实现这类功能虽然不难,但代码很繁琐,很容易出错. 使用集算器来辅助Java编程,这些问题都不需要自己写代码解决.下面我们通过例子来看一下具体作法. 文本文件data.txt是tab分割的文本文件,有30个列,第一行是具有业务意义的列名,现在需要按列名读入这几列:ID.x1Shift.x2Shift.radio,并按业务公式“((x1Sh

集算器协助java处理多样性数据源之HDFS

Java通过Hadoop提供的API访问HDFS不算困难,但针对其上文件的计算就比较麻烦.比如分组.过滤.排序等计算,用java来实现都比较复杂.集算器esproc能很好地协助java解决计算问题,同时也封装了HDFS的访问,借助esproc可以让java加强HDFS上文件的计算能力,结构化半结构化数据计算都可以轻松完成.下面我们通过例子来看一下具体作法. HDFS中的文本文件employee.gz中保存了员工数据.我们要读取员工信息,从中找出1981年1月1日(含)之后出生的女员工.文本文件在

集算器协助java处理多样性数据源之MongoDB

MongoDB不支持join,其官网上推荐的unity jdbc可以把数据取出来进行二次计算实现join运算,但这些join.group.函数.表达式等高级功能都是收费版才有,而且即使是收费版本,对子查询.窗口函数等复杂SQL运算仍不支持.其他免费的jdbc drive就只能支持最基本的SQL语句了. 用免费的esProc配合MongoDB,可以实现上述结构化(半结构化)复杂计算.这里以join为例说明一下具体作法. MongoDB中的文档orders保存了订单数据,employee保存了员工数

集算器协助java处理多样性数据源之JSON

Java的json开源包一般只能解析json数据,没有运算功能.程序员自己写通用的程序来实现分组.排序.过滤.连接这些计算,相当麻烦.例如:用java写json文件条件过滤程序时,当条件表达式发生变化时就需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 集算器是支持动态表达式的,可以嵌入到Java中写出通用的json计算程序.下面我们通过例子来看一下具体作法.待处理字符串是json格式的员工信息,包含EID.NAME.SURNAME.GE

润乾集算报表优化应用结构之本地计算

在报表项目中,常常会碰到数据库压力很大影响整个系统性能的问题.由下面的传统方案的结构示意图可以看出,全部数据存储和源数据计算都放在数据库完成.当并发访问量较大的时候,虽然每个报表的数据量不大,还是会造成数据库压力过大,成为性能的瓶颈.多数数据库厂商提供的jdbc接口传输数据比较缓慢,在并发量较大的情况,对报表系统性能的影响也非常明显. 这种情况时可以考虑采用润乾集算报表提供的本地计算方案. 所谓本地计算,是将一部分计算任务从数据库中移出到报表服务器中完成.大多数有一定规模的应用系统中,数据库和应