报表工具怎样使用 Json/XML 的数据
Json/XML是多层结构的数据,很多报表工具没有直接支持,必须引入相关的第三方类库,比如JsonPath/Dom4J。这些类库计算能力较弱,代码繁琐冗长,集成过程也很麻烦。有些报表工具封装了这些类库,优点是可以提供友好的取数向导,也替用户省去了集成的麻烦,但封装解决不了计算问题,只能推给报表工具。报表工具专注展现,较简单的计算勉强能实现,复杂些的就要依靠自定义数据集了,代码依旧繁琐冗长。
更好的办法是用JAVA开源计算类库SPL,既有方便的Json/XML解析函数,又有强大的多层数据计算能力,还有易于被报表集成的JDBC接口。
SPL内置Json/XML解析函数,可以方便地读取数据。比如某Json文件是多层结构,由多条员工记录及员工的多个订单组成,用SPL取所有的员工记录:
A |
|
1 |
=json(file("d:/Orders.json").read()) |
2 |
=json(A1) |
取所有的订单记录:
A |
|
1 |
=json(file("d:/Orders.json").read()) |
2 |
=json(A1).conj() |
XML的解析思路与Json基本一致,唯一的区别是须指定记录所在的节点路径名。比如某XML文件与前面的Json同构,下面读取所有订单:
A |
|
1 |
=xml(file("d:/Orders.xml").read(),"xml/row") |
2 |
=json(A1).conj() |
SPL内置丰富的计算函数,可以用简单直观的语法计算多层数据,从而避免繁琐的硬编码。比如对订单进行区间查询,其中p_start、p_end是参数:
A |
|
2 |
…//取得所有订单 |
3 |
=A2.select(Amount>p_start && Amount<=p_end) |
SPL的计算语法通用于各类数据源,XML和Json只是取数过程不同,计算代码没区别,这里不再分开说明。
SPL提供了JDBC驱动,可以被报表工具方便地集成。对于上面的区间查询,先存为脚本文件intervalQuery.splx,再在报表工具里以存储过程的形式调用脚本文件名。以JasperReport为例,可写作:
call intervalQuery($P{paramStart}, $P{paramEnd})
再举几例:
A |
B |
|
2 |
…//取得员工记录 |
|
3 |
=A2.conj().select(Amount>1000 && like(Client,\"*S*\")) |
/模糊查询 |
4 |
=A2.conj(Orders).groups(Client;sum(Amount)) |
/多层数据分组汇总 |
5 |
=A2.groups(State,Gender;avg(Salary),count(1)) |
/单层数据分组汇总 |
6 |
=A2.sort(Salary) |
/排序 |
7 |
=A2.id(State) |
/去重 |
8 |
=A2.new(Name,Gender,Dept,Orders.OrderID,Orders.Client,Orders.Client,Orders.SellerId,Orders.Amount,Orders.OrderDate) |
/关联 |
SPL可以从多种来源里读取Json/XML,除了本地文件,也支持局域网、FTP、HDFS、WebService、Restful等。比如从Restful读取json串,对订单进行区间查询:
A |
|
1 |
=httpfile("http://127.0.0.1:8086/api/getOrders").read() |
2 |
=json(A1).conj() |
3 |
=A2.select(Amount>p_start && Amount<=p_end) |
SPL还提供了标准SQL语法,可有效降低学习门槛,适合代码短难度低的计算。比如区间查询,可以在报表工具中建立SQL数据集,并编写如下SQL语句:
$select * from {json(file("d:/Orders.json").read()).conj()}
where Amount>$P{paramStart} and Amount<=$P{paramEnd}
再比如两个json的关联:
$select e.name, s.orderdate, s.amount from {json(file("d:/sales.json").read())} s left join { json(file("d:/employees.json").read())} e on s.sellerid= e.eid
更多例子参考《在文件上使用 SQL 查询的示例》
SPL具有强大的计算能力,可简化分步计算、有序计算、分组后计算等逻辑较复杂的计算,很多SQL很难实现的计算,用SPL解决起来就很轻松。比如,找出销售额累计占到一半的前n个大客户,并按销售额从大到小排序:
A |
B |
|
1 |
… |
/取数据 |
2 |
=A1.sort(amount:-1) |
/销售额逆序排序 |
3 |
=A2.cumulate(amount) |
/计算累计序列 |
4 |
=A3.m(-1)/2 |
/最后的累计即总额 |
5 |
=A3.pselect(~>=A4) |
/超过一半的位置 |
6 |
=A2(to(A5)) |
/按位置取值 |
SPL提供了专业的IDE,不仅具备完整的调试功能,还能以表格的形式观察每一步的计算结果,适合开发逻辑较复杂的计算。
除了Json/XML之外,SPL还支持txt、csv、xls等多种文件,以及MongoDB、Hadoop、redis、ElasticSearch、SalesForce、Cassandra等多种NoSQL,以及不同数据源/数据库之间的混合计算。
英文版