…
Class.forName("com.esproc.jdbc.InternalDriver");
Connection connection =DriverManager.getConnection("jdbc:esproc:local://");
Statement statement = connection.createStatement();
String str="=T(\"D:/Orders.txt\").sort(Client,- Amount)";
ResultSet result = statement.executeQuery(str);
…
一个T函数就相当于内嵌数据库入库那一整套过程,比那些内嵌的数据库方案要方便多了。
str="$select * from d:/Orders.txt order by Client, Amount desc"
再讲讲刚才的sort函数,这样的基本计算函数SPL有上百个,可以直接完成大多数常规计算。下面试举一些:
//条件查询
str="=T(\"D:/Orders.txt\").select(Amount>1000 && Amount<=3000 && like(Client,\"*S*\"))";
//分组汇总
str ="=T(\"D:/Orders.txt\").groups(year(OrderDate);sum(Amount))";
//关联
str ="=join(T (\"D:/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)";
A | B | |
1 | =[T("d:/orders1.csv"), T("d:/orders2.csv")].merge@u() | /对记录做并集 |
2 | file("d:/fast.btx").export@b(A1) | /写入集文件 |
之后就可以像普通文件那样使用:
str="=T(\"D:/fast.btx\").sort(Client,- Amount)"
str="$select * from d:/fast.btx order by Client, Amount desc"
btx还可以预先进行有序化处理,从而获得更高计算性能,比如进行二分查找,详情参考官网。
A | B | |
1 | = T("D:/data/sales.csv").sort(amount:-1) | 取数并逆序排序 |
2 | =A1.cumulate(amount) | 计算累计序列 |
3 | =A2.m(-1)/2 | 最后的累计值即是总和 |
4 | =A2.pselect(~>=A3) | 超过一半的位置 |
5 | =A1(to(A4)) | 按位置取值 |
再在JAVA代码中以存储过程的方式调用脚本文件:
…
Class.forName("com.esproc.jdbc.InternalDriver");
Connection connection =DriverManager.getConnection("jdbc:esproc:local://");
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("call bigCustomer ()");
...
有些运算较复杂,比如涉及分组后计算、有序计算、集合计算,即使用存储过程也难以解决,更别说连存储过程都不支持的内嵌数据库了。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,可以方便地跟踪调试,观察每一步的计算结果:
= file("D:/Orders.txt").import (;,"||")
A | |
1 | =json(httpfile("http://127.0.0.1:6868/api/getEmpOrders").read()) |
2 | =A1.conj(Orders) |
3 | =A2.select(Amount>500 && Amount<=2000 && like@c(Client,"*bro*")) |
集算器SPL是优秀的JAVA嵌入式开源计算库,在结构化计算方面比数据库更强,在多层数据的计算方面比Dataframe更方便,在多数据源支持方面更是全面超过两者。