计算处理 Json 的 Java 开源库 esProc SPL 您所在的位置:网站首页 洋葱学院下载安装 计算处理 Json 的 Java 开源库 esProc SPL

计算处理 Json 的 Java 开源库 esProc SPL

2023-06-15 04:21| 来源: 网络整理| 查看: 265

esProc SPL是强大的开源计算引擎,可以方便地处理json相关的运算。

下载、安装、集成

源代码在这里:github.com/SPLWare/esProc,不过从源码编译比较麻烦,官方提供了已经编译好的安装包,可以从c.raqsoft.com.cn/article/1595816810031下载,如果这个链接失效,则可以搜索esProc SPL找到官网下载。

安装之后,在 [安装目录]\esProc\lib下可以找到Java集成需要的3个jar包:

esproc-bin-xxxx.jar esProc SPL及其JDBC驱动包 icu4j_60.3.jar 处理国际化 jdom-1.1.3.jar 解析配置文件

将上述jar包引入自己的Java项目,就可以通过JDBC接口执行SPL代码了:

Class.forName("com.esproc.jdbc.InternalDriver"); Connection connection =DriverManager.getConnection("jdbc:esproc:local://"); Statement statement = connection.createStatement(); ResultSet result = statement.executeQuery("=1"); result.next(); int IntResult=results.getInt(1);

上述代码能正常执行,并且在 IntResult 中可以提到结果 1,就说明集成成功了。

基本Json运算

现在就可以用SPL处理Json了。

先试个简单的情况。strJson是Java里的Json字符串变量,部分内容:

[ {"OrderID":32,"Client":"JFS","SellerId":3,"Amount":468.0,"OrderDate":"2009-08-13"} {"OrderID": 70,"Client": "DSG","SellerId": 7,"Amount": 288,"OrderDate": "2009-09-30"}, {"OrderID": 131,"Client": "FOL","SellerId": 7,"Amount": 103.2,"OrderDate": "2009-12-10"}, ... ]

Java 将该字符串传给 SPL,由 SPL 进行分组汇总:

PreparedStatement pstmt = connection.prepareStatement("=json(?).groups(Client;sum(Amount):amt, count(1):cnt)"); pstmt.setString(1,strJson); ResultSet result =pstmt.executeQuery();

可以像常规调用数据库 SQL 一样,在语句中用? 传递参数,只不过用的语句不是 SQL 了。查看返回的 result,可以看到计算结果如下:

Client amt cnt ARO 899.0 1 BDR 4278.8 4 BON 2564.4 1 …

上面返回表格形式的ResultSet,也可以返回成Json串:

PreparedStatement pstmt = connection.prepareStatement("=json(json(?).groups(Client;sum(Amount):amt, count(1):cnt))"); pstmt.setString(1,strJson); ResultSet result =pstmt.executeQuery(); result.next(); String strResult=results.getString(1);

计算结果:[{“Client”:“HDR”,“amt”:21040.0,“cnt”:21},{“Client”:“IBM”,“amt”:19030,“cnt”:19},…]

来自文件的Json就更简单了。用SPL代码读同样内容的Json文件,并进行分组汇总:

statement.executeQuery("=json(file(\"d:/orders.json\").read()).groups(Client;sum(Amount):amt, count(1):cnt)");

可以得到同样的计算结果。

SPL支持丰富的字符串和日期函数。比如:过滤出年份为2021年,且客户名包含指定字符串的订单(后续只写SPL代码):

=json(file(\"d:/orders.json\").read()).conj(Orders).select(year(OrderDate)==2012 && like@c(Client,"*business*"))

更多的计算函数和语法可以去参考官网文档,大多数常规运算都只要一句就能搞定。

进阶Json计算

计算多层Json

json经常是多层的,比如这样一段json,上层是员工记录,下层是员工的订单记录:

[{ "EId": 7,"State": "Illinois","Dept": "Sales","Name": "Alexis","Gender": "F","Salary": 9000,"Birthday": "1972-08-16", "Orders": [ {"OrderID": 70,"Client": "DSG","SellerId": 7,"Amount": 288,"OrderDate": "2009-09-30"}, {"OrderID": 131,"Client": "FOL","SellerId": 7,"Amount": 103.2,"OrderDate": "2009-12-10"} ] } { "EId": 8,"State": "California", ... }]

计算目标:Java 将该 json 串传入 SPL,SPL 解析 Json,合并下层订单,并进行过滤。这里的计算步骤稍多,需要更专业的 SPL 开发和调试环境。执行 [安装目录]\esProc\bin\esproc.exe(Linux\Mac 下为 esproc.sh), 打开 SPL IDE,编辑以下脚本文件:

A

1

=json(strJson)

2

=A1.conj(Orders)

3

=A2.select(Amount>arg1 && AmountParameter 定义参数,如下:

2png注意:在 SPL 代码里,Json 串是常数,可以直接使用,但在 Java 代码里,Json 串是普通字符串,传入 SPL 后需要先用 json() 函数解析再使用。为了保持代码一致,在 IDE 里测试 Json 串参数时,需要在前面加单引号,以便模拟成普通字符串。执行或调试脚本后,依次点击 A1-A3,可以在右侧看到每一步的计算结果:

3png

4png

6png

在 Java 中调用 SPL 脚本:将上述 SPL 脚本存为文件 (比如 splFile.splx),再在 Java 中以存储过程的形式引用该文件名。

Class.forName("com.esproc.jdbc.InternalDriver"); Connection connection =DriverManager.getConnection("jdbc:esproc:local://"); CallableStatement statement = connection.prepareCall("{call splFile (?,?, ?)}"); statement.setString(1,strJson); statement.setInt(2, 1000); statement.setInt(3, 3000); ResultSet result= statement.executeQuery();

Json 串经常来自 HTTP 数据源(比如 Restful),而不是文件。SPL 可以直接读 HTTP 数据源,这样就不必从 Java 中传入参数了。比如:

A

1

=httpfile("http://127.0.0.1:6868/restful/emp_orders").read()

2

=json(A1)

3

=A2.conj(Orders)

4

=A3.select(Amount>1000 && Amount1000 && Amount



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有