Java有什么开源包能做查询统计的?
做查询统计的开源包,Python上有著名的Pandas,JAVA上自然就有大批模仿者,其中Tablesaw和Joinery比较有名,但成熟度、计算能力、函数丰富程度等方面都远不如Pandas,而且改了还得编译(Pandas和SQL就不用)。如果不怕麻烦且数据量小,倒不如在SQLite里建表、读源数据、导入数据,然后用SQL做查询统计,全程可以都可以用JAVA实现。
纯Java的开源包,集算器SPL比SQLite好用多了,而且不麻烦。
SPL的接口是JDBC,程序员看一遍就能学会,比如对Orders.txt进行条件查询:
… Class.forName("com.esproc.jdbc.InternalDriver"); Connection connection =DriverManager.getConnection("jdbc:esproc:local://"); Statement statement = connection.createStatement(); String str="=T(\"D:/data/Orders.txt\").select(Amount>1000 && Amount<=3000 && like(Client,\"*S*\"))"; ResultSet result = statement.executeQuery(str); …
SPL做查询统计很方便,除了条件查询,还提供了大量的基本计算函数,比如:
//排序 str ="=T(\"D:/data/Orders.txt\").sort(Client,-Amount)"; //去重 str="=T(\"D:/data/Orders.txt\").id(Client)"; //分组汇总 str ="=T(\"D:/data/Orders.txt\").groups(year(OrderDate);sum(Amount))"; //关联 str ="=join(T (\"D:/data/Orders.txt\"):O,SellerId; T(\"D:/data/Employees.txt\"):E,EId).new(O.OrderID,O.Client,O.SellerId,O.Amount,O.OrderDate, E.Name,E.Gender,E.Dept)";
为了方便数据库程序员,集算器也提供了对应的SQL语法,比如分组汇总也可以写作下面这样:
str="$SELECT year(OrderDate),sum(Amount) from Orders.txt group by year(OrderDate) "
SPL支持多种数据源,除了上面的文本文件,还支持数据库、Excel、各类NoSQL、Restful等。
SPL脚本可以像上面那样内嵌于JAVA代码(类似SQL);遇到步骤较多,可能频繁修改,需要降低耦合性的运算,SPL脚本也可以外置于脚本文件(类似存储过程)。比如:在各部门找出比本部门平均年龄小的员工。先将SPL脚本存为文件:
A | |
1 | =T("Employee.csv") |
2 | =A1.group(DEPT; (a=~.avg(age(BIRTHDAY)),~.select(age(BIRTHDAY)<a)):YOUNG) |
3 | =A2.conj(YOUNG) |
再在JAVA代码中以存储过程的方式调用脚本文件:
… Class.forName("com.esproc.jdbc.InternalDriver"); Connection connection =DriverManager.getConnection("jdbc:esproc:local://"); Statement statement = connection.createStatement(); ResultSet result = statement.executeQuery("call getYoung()"); ...
有些运算逻辑比较复杂,用数据库存储过程都很难写,而SPL提供了更丰富的计算函数和语法,可以大幅简化复杂运算逻辑。比如:计算某支股票最长的连续上涨天数,SPL只需两行:
A | B | |
1 | =T("d:/AAPL.xlsx") | 读Excel文件,首行为列名 |
2 | =a=0,A1.max(a=if(price>price[-1],a+1,0)) | 求最长连续上涨天数 |
外置的脚本文件可以用SPL专用的IDE进行编辑调试,不仅具备完整调试功能,还能随时观察每一步的计算结果,特别适合设计逻辑更复杂的计算:
在查询统计方面,集算器SPL明显比其它开源包更胜一筹,在数据源种类、跨源计算、大数据和并行计算等方面,集算器SPL也均有出色表现,这里不再详细展开。