Java 有什么开源包能做查询统计的?

 

Java有什么开源包能做查询统计的?

做查询统计的开源包,Python上著名的PandasJAVA上自然就有大批模仿者,其中TablesawJoinery比较有名,但成熟度、计算能力、函数丰富程度等方面都远不如Pandas,而且改了还得编译(PandasSQL就不用)。如果不怕麻烦且数据量小,倒不如在SQLite里建表、读源数据、导入数据,然后用SQL做查询统计,全程可以都可以用JAVA实现。

Java的开源包,集算器SPLSQLite好用多了,而且不麻烦。

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、各类NoSQLRestful等。

SPL脚本可以像上面那样内嵌于JAVA代码(类似SQL);遇到步骤较多,可能频繁修改,需要降低耦合性的运算SPL脚本也可以外置于脚本文件(类似存储过程)。比如:在各部门找出比本部门平均年龄小的员工。先将SPL脚本存为文件:


A

1

=T("Employee.csv")

2

=A1.group(DEPT; (a=~.avg(age(BIRTHDAY)),~.select(age(BIRTHDAY)

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也均有出色表现,这里不再详细展开。