- 浏览: 163525 次
最新评论
-
mx122723:
不错,学习了!
解决报表特殊布局的若干示例 -
Long_yuan:
说了半天加个字段就好了嘛。。。。。。
MongoDB的本地化排序 -
windlike:
...
查询MongoDB子文档的List字段 -
Long_yuan:
既然用mongodb 还是赶紧丢掉sql设计范式吧
MongoDB的外键关联处理 -
datamachine:
m635674608 写道收费的吧???不是开源的吧??有免费 ...
结构化文本文件之间的集合运算
文章列表
集算器可以方便地用并行方式处理大文本文件,下面通过一个例子来说明使用方法。
假设有个一千万条销售记录的文本文件sales.txt,其主要字段是SellerID(销售员)、OrderDate(订单日期)、Amount(订单金额),请计算每个销售员在近四年里的大订单总金额。其中,金额在2000以上的属于大订单。
要进行并行处理,首先要能对文件进行分段,集算器提供了游标数据对象cursor及其函数,可以方便地分段读取大文本文件。比如file(“e:/sales.txt”).cursor@tz(;, 3:24),这表示将文件按字节数大致均分为24段,然后读取其中第3段。简单的按字节拆分文件时会产生 ...
问题来源:http://stackoverflow.com/questions/26820118/text-file-processing-using-java
JAVA没有直接处理文本文件的连接运算的类库,自行编码非常复杂,特别是文件太大无法放入全部读入内存时。集算器可以协助JAVA实现这些运算,下面通过例子来看一下具体作法。
文本文件order.txt的第一行是列名,列SellerId是逻辑外键,指向employee.txt的列EID,现在需要从两个文件中取出列OrderID、Client、Name、Dept,并形成新的文件。部分源数据如下:
Order.txt
...
直接用Java实现文本文件排序,对于小文件还较为简单,如果是内存装不下的大文件,需要分段读入数据,再将每段排序结果写成临时文件,最后归并这些临时文件,编程非常复杂。即使只处理内存可放下的小文件,也要面对解析文本中数据类型的任务,虽然不是很难,但要写较长的代码。
使用集算器辅助java编程就可以轻松规避这些问题。下面我们来看一下具体作法。文本文件employee.txt中保存的员工信息,需要按照STATE的升序和BIRTHDAY的降序排序。假设文件中的数据量较大,内存不能一次装入。
empolyee.txt的格式如下:
EID NAME SURNAME ...
JAVA不直接支持集合运算,因此要用嵌套循环才能实现文本文件之间的交集、并集、差集等集合运算,如果文件数量较多,或者文件较大而无法放入内存直接计算,再或者要按照多个字段进行集合运算,则相应的代码会更加复杂。集算器直接支持集合运算,可以协助JAVA轻松实现此类算法,下面我们通过例子来看一下具体作法。
有两个小文件:f1.txt和f2.txt,第一行是列名,现在需要对文件中的Name字段进行交集运算。部分数据如下:
文件f1.txt:
文件f2.txt:
集算器代码:
直接用Java实现文体文件分组汇总会有如下的麻烦:
1、文件不是数据库,不能用SQL访问。当分组、汇总表达式变化时,只能改写代码。而要实现灵活表达式的话,需要自己实现动态表达式解析和求值,编程工作量非常大。
2、遍历过程中记录分组结果,结果小了还可以存在内存中,如果分组结果太大时要将中间结果缓存进临时文件再归并,实现过程非常复杂。
使用集算器辅助Java编程,这些问题都有现成的类库可以解决。下面,我们通过例子来看一下具体作法。
文本文件employee.txt中保存有员工信息,我们要按照DEPT分组,求出每组的员工个数COUNT和薪酬SALARY总额。
文本文件em ...
直接用JAVA将结构化文本文件导入数据库时,需要手工拼凑SQL语句,还需要处理各种麻烦情况,比如:表中数据是否已经存在,是要update还是要insert,文件中是否包含字段,文件中的字段是否和表字段一致。
使用集算器来辅助Java编程,这些问题都不需要自己写代码解决。下面我们通过例子来看一下具体作法。
文本文件sales.txt中存储着销售订单数据,列分隔符是tab,前几行数据如下:
下面,我们要把sales.txt导入到结构相同的空表中。
先在集算器中编写脚本,脚本名为test.dfx
数据库有关联语句,可以方便地进行对齐连接运算,但有时数据是存储在文本文件中的,用JAVA直接计算需要写大量循环语句才能实现,代码繁琐且运行低效。使用集算器来辅助Java编程,可以方便高效地解决此类问题。下面我们通过例子来看一下具体作法。
文本文件emp.txt存储着员工信息,EId等于1的员工不在该文件中。文本文件sOrder.txt存储着订单信息,其SellerId字段和emp中的EId字段相对应,SellerId等于2的订单不在该表中。部分源数据如下:
emp.txt:
集算器能够协助java处理结构化文本的各种计算工作,但碰到非单行记录的情况就不能直接计算了,这时需要先进行一些必要的变换处理。
比如,文本文件Social.txt中存储着网站的访问记录,每三行对应一条记录,现在需要整理出这些记录,再进行下一步的计算。记录需要按(UserID, Time, IP, URL, Location)的格式取出使用或存放在文件中。注意:列分隔符是tab,行分割符是回车换行,前几行数据如下:
该文件每三行对应一条记录,其中第一行的IP、URL、Time是有用数据,第二行数据无用,第三行的UserID和 ...
JAVA不直接支持动态解析文本文件中的表达式,只能通过手工拆分字符串再递归调用来实现,这需要编写大量代码,过程复杂难以维护。使用集算器来辅助Java编程,这些问题就不需要自己写代码了,下面我们通过例子来看一下具体作法。
文本文件formula.txt是tab分割的文本文件,第一行是列名,有3个列No、type、exp,其中exp列是公式。现在需要动态解析exp中的公式,并将计算结果附加在exp之后,命名为value列。文件fromula.txt的前几行数据如下:
有这样一类文本文件:文件太大无法全部读入内存计算;但数据已按某列排序,如果以该列为标准每次读取一组数据,则可以放入内存进行计算。电信通话记录、网站访问记录、商场会员信息等等都属于此类文件。
JAVA实现此算法需要编写大量代码,过程复杂难以维护。使用集算器来辅助Java编程,这类问题就轻松许多。下面我们通过例子来看一下具体作法。
文本文件sOrder.txt存储着大量的订单信息,以tab为分隔符,第一行是列名,数据已按SellerId排序。现在需要每次读入SellerId相同的一组数据,并对每组数据执行同样的数据处理过程。
文件sOrder.txt的部分数据如下:
集算器脚本 ...
直接用Java实现文本文件中数据按条件过滤会有如下的麻烦:
1、文件不是数据库,不能用SQL访问。当过滤条件变化时需要改写代码。如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大。
2、文件太大时不能一次性装入内存处理,而采用逐步读入方式在考虑到性能时又会涉及到文件缓冲区管理、拆行计算等复杂编程。
使用集算器来辅助Java编程,这些问题都不需要自己写代码解决。下面我们通过例子来看一下具体作法。
文本文件employee.txt中保存了员工数据。我们要读取员工信息,从中找出1981年1月1日(含)之后出生的 ...
在报表项目中,有些报表的数据计算方法会经常改变。例如:某企业员工的实际工资是通过绩效得分计算出的,算法经常变动,需要在不改动其他代码的情况下用新算法替换旧算法。如果用Java来实现计算的话,虽然可以实现动态可挂接计算模块,但是存在缺乏基础类库、占用多余内存等问题。
采用润乾集算报表可以很好的解决这些问题,实现低耦合、热部署的动态挂接算法。集算报表挂接算法系统结合和其他报表工具+java的系统结构对比图如下:
上图可以看出,java程序必须要编译、打包才能更新。集算脚本是解释执行的,脚本文件同时也是可执行文件,所以可以直接替换文件更新。同时,集 ...
复杂数据源是报表开发的常见问题,比如不同数据库表先进行join运算,再进行后续的过滤分组排序等运算。JasperReport/Birt等报表工具有virtual data source或table join,可以一定程度地实现多数据源join后计算,但掌握起来并不容易。
集算器具有结构化强计算引擎,支持多样性数据源,集成简单,可以协助报表工具方便地实现此类需求,下面通过一个例子来说明多数据源join后计算的过程。
Sales是mysql数据库中的表,存储着多名销售员每天的多个订单,其中字段SellerId是销售员编号。emp是mssql数据库中的表,存储着销售员信息,其 ...
在报表应用中,针对历史数据查询的报表占比很大,这类报表的特点是:第一,数据变化小,查询的历史数据几乎不会发生变化;第二,数据量大,数据量随时间跨度增大而不断增加。如果数据始终存放在数据库中,由于大多数数据库的JDBC性能都很低下(JDBC取数过程要做数据对象转换,比从文件中读取数据会慢一个数量级),这时涉及数据量较大或在并发较多的时候,报表的性能会急剧下降。如果能将这些变化不大的历史数据移出数据库,采用文件系统存储,将可能获得比数据库高得多的IO性能,从而提高报表的整体性能。
但是,报表并不是直接使用原始数据进行呈现,还需要做进一步的运算。而文件本身没有计 ...
在报表项目开发中常常会出现自定义数据源的情况。这是因为有很多结构化计算比较复杂,需要多步骤完成。sql或者报表本身的计算能力并不适合完成这种过程化计算,所以报表程序员会借助于报表API,使用Java程序来完成。
例如这个《各地区销售情况分析表》:
该报表是根据订单表统计各(预置)时间段内,各地区的订单数量、订单金额汇总。其中各时间段范围为:
1996年圣诞前:date < 1996-12-25
1996年圣诞--1997年国庆:1996-12-25 <= date <= 1997-10-1
1997年国庆--1998年五一:1997-1 ...