从JsonPath和XPath到SPL( 二 )

JsonPath/XPath不支持分组汇总,只能自行编码完成大部分计算,这就要求程序员控制所有细节,代码冗长且容易出错 。如果换一个分组字段或汇总字段,则要修改多处代码,如果对多个字段分组或汇总,代码还需大量修改,很难写出通用代码 。
JsonPath/XPath的计算能力严重不足,不支持大部分基础计算,除了分组汇总,还包括:重命名、排序、去重、关联计算、集合计算、笛卡尔积、归并计算、窗口函数、有序计算等 。JsonPath/XPath也不支持将大计算目标分解为基础计算的机制,比如子查询、多步骤计算等,因此难以进行较复杂的计算 。
除了计算能力之外,Jsonpath/XPath还有个问题,就是没有自己的HTTP接口,必须自行编码或利用第三方HTTP函数库,比如JourWon、Arronlong,前面的例子就使用了Arronlong函数库 。除了基础的HTTP之外,MongoDB或elasticSearch也可以返回多层数据,每种数据源的接口协议都不同,Jsonpath/XPath没有提供相关的接口,只能自己写或再引入第三方类库,这导致架构复杂、不稳定因素增大、开发效率降低 。
JsonPath/XPath的计算能力不足,导致开发效率低下 。要想提高开发效率,必须使用计算能力足够的json/XML处理技术 。
SPL是更优的选择 。
SPL具有足够的计算能力esProc SPL是JVM下开源的结构化数据/多层数据处理语言,内置专业的多层数据对象,提供了丰富的计算函数、字符串函数、日期函数,具有不亚于SQL的计算能力,可以提高WebService/Restful后处理的开发效率 。
SPL内置专业的多层结构化数据对象,为计算功能提供了有力的底层支撑
比如,从文件读取XML字符串,解析为SPL序表:
 
A
1
=file("d:\xml\emp_orders.xml").read()
2
=xml(A1,"xml/row")
点击A2格可以看到多层序表的结构,其中,EId、State等字段存储简单数据类型,Orders字段存储记录集合(二维表) 。点击Orders中的某一行,可以展开观察数据:

从JsonPath和XPath到SPL

文章插图
 
SPL序表是专业的数据对象,可以表示结构任意复杂的多层数据,下面再看一个例子:
从JsonPath和XPath到SPL

文章插图
 
序表的专业性还体现在,可以表示任意来源的二维或多层数据,包括但不限于XMLJson,文件网络服务 。比如,从文件读取Json字符串(与前面的XML同构),解析为SPL序表:
 
A
1
=file("d:\xml\emp_orders.json").read()
2
=json(A1)
这里的序表和前面来自XML的序表没有区别,后续的计算代码完全一样,下面以Json为主进行说明 。
SPL内置丰富的计算函数,基础计算一句完成
比如,同样对多层Json进行条件查询:
 
A
2
…//省略取数解析
3
=A2.conj(Orders)
4
=A3.select(Amount>1000 && Amount<=2000 && like@c(Client,"*business*"))
可以看到,SPL对条件查询的支持很完整,覆盖了JsonPath/XPath的功能,包括关系运算符、逻辑运算符、正则表达式和字符串函数,如模糊匹配like 。此外,SPL还支持在条件查询中使用数学运算符(函数)、位置函数、日期函数 。SPL可以灵活地访问不同层级,且代码更简单,如代码中的A2.conj(Orders) 。
SPL实现各类聚合计算也很简单,比如求和:=A3.sum(Amount)
SPL支持丰富的基础计算,具有不亚于SQL的计算能力,比如JsonPath/XPath必须硬编码实现的分组汇总,SPL一句就行:
=A2.conj(Orders).groups(Client;sum(Amount))
更多例子:
 
A
B
【从JsonPath和XPath到SPL】1
….
 
3
=A2.groups(State,Gender;avg(Salary),count(1))
多字段分组汇总
4
=A1.new(Name,Gender,Dept,Orders.OrderID,Orders.Client,Orders.Client,Orders.SellerId,Orders.Amount,Orders.OrderDate)
关联
5
=A1.sort(Salary)
排序
6
=A1.id(State)
去重
7
=A2.top(-3;Amount)
topN
8
=A2.groups(Client;top(3,Amount))
组内TopN(窗口函数)
SPL提供了大量日期和字符串函数,开发效率更高
SPL支持大量日期函数和字符串函数,在数量和功能上远远超过JsonPath/XPath甚至SQL,同样的运算代码量更短 。比如:
时间类函数,日期增减:elapse("2020-02-27",5) //返回2020-03-03


推荐阅读