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进行编辑调试,不仅具备完整调试功能,还能随时观察每一步的计算结果,特别适合设计逻辑更复杂的计算:

idepng

在查询统计方面,集算器SPL明显比其它开源包更胜一筹,在数据源种类、跨源计算、大数据和并行计算等方面,集算器SPL也均有出色表现,这里不再详细展开。