有什么支持跨数据库运算的开源库
有些数据库自带跨数据库运算功能,比如DBlink和Linked Server,但都不开源,配置也复杂,而且大多数计算要先把数据取到本地,性能比较差。对于支持跨数据库运算的开源库,Scala可以充分利用数据库的计算能力,性能足够优秀,缺点是架构沉重,代码冗长,数据超出内存时也容易发生故障。Calcite和Tablesaw的优点是配置简单,架构轻便,缺点是成熟度都不高,很多计算函数都不支持。
相对来讲,支持跨数据库运算的JAVA开源库,SPL是更好的选择。
SPL不仅代码简单,而且配置简单,架构轻便,还提供了易于集成的JDBC接口。对于超出内存的数据和分库等特殊情况,SPL也有针对性地进行了优化,在保证稳定和效率的前提下,对代码进行了大幅简化。
SPL可以充分利用数据库的计算能力。远程数据库先执行SQL或存储过程,SPL将数据量较小的计算结果取到本地,再进行跨库运算。比如,用MySQL分组汇总的结果,和Oracle表进行跨库关联:
A  |  
  |
1  |  
   =orcl.query("select EId,Name from employees")  |  
  
2  |  
   =mysql1.query("select SellerId, sum(Amount) subtotal from Orders group by SellerId")  |  
  
3  |  
   =join(A1:O,SellerId; A2:E,EId).new(O.Name:name, O.Dept:dept, E.subtotal:amt)  |  
  
SPL提供了丰富的计算函数,可以用简单直观的代码完成跨库后的计算。比如,跨库运算后按页取记录,其中p_size是每页记录数,p_No是页号:
A  |  
  |
3  |  
   …//跨库运算  |  
  
4  |  
   =A3.to(p_Size*(p_No-1),p_Size*p_No)  |  
  
SPL提供了JDBC接口,方便被JAVA程序调用。比如,
…
Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
CallableStatement statement = conn.prepareCall("{call pageQuery(?, ?)}");
statement.setObject(1, 10);
statement.setObject(2, 3);
statement.execute();
...
再举几例:
A  |  
   B  |  
  |
3  |  
   …  |  
   |
4  |  
   =A2.select(amt>1000 && like(dept,\"*S*\"))  |  
   //查询  |  
  
5  |  
   =A2.sort(dept,-amt)"  |  
   //排序  |  
  
6  |  
   =A2 .id(dept)  |  
   //去重  |  
  
7  |  
   =A2.groups(dept;sum(amt))  |  
   //分组汇总  |  
  
对于超出内存的数据,SPL提供了游标机制,不仅代码简短,而且稳定可靠。比如,表Employees和Orders都是大表,分属不同的数据库,下面先跨库关联,再分组汇总:
A  |  
  |
1  |  
   =orcl.cursor("select EId, Dept from Employees order by EId")  |  
  
2  |  
   =mysql1.cursor("select SellerId, Amount from Orders order by SellerId")  |  
  
3  |  
   =joinx(A2:O,SellerId; A1:E,EId)  |  
  
4  |  
   =A3.groups(E.Dept;sum(O.Amount))  |  
  
上面代码利用了有序归并进行关联,性能也更好。
对于分库的跨库运算,SPL提供了并行计算语法,代码非常简短:
A  |  
   B  |  
   C  |  
  |
1  |  
   =[connect("mysql1"),connect("mysql2"),connect("mysql3")]  |  
   /连接多个mysql  |  
  |
2  |  
   select * from orders where amount>=10000  |  
   /SQL  |  
  |
3  |  
   fork A1  |  
   =A3.query@x(A2)  |  
   /并行执行SQL  |  
  
4  |  
   =A3.conj()  |  
   /合并结果  |  
  
除了数据库,SPL也支持CSV/XLS等文件数据源和多种NoSQL,以及不同数据源/数据库之间的混合计算。
            
        

英文版