文章目录
在 JAVA 应用中经常要处理 txt\csv\json\xml\xls 这类公共格式的数据文件,直接用 JAVA 硬写会非常麻烦,通常要借助一些现成的开源包,但这些开源包也都有各自的不足。
解析库。这种类库解决了从外部文件到内部对象的问题,比硬编码取数好写,常见的有解析 txt\csv 的 OpenCSV,解析 json 的 SJ.json\Gson\JsonPath,解析 xml 的XOM\Xerces-J\Jdom\Dom4J,解析 xls 的 POI。其中,JsonPath 支持 JsonPath 语法,Dom4J 等支持 XPath 语法,可以进行简单的过滤运算。但总的来说,这种类库的计算能力很弱,要借助硬编码或其他类库完成计算。
Spark。Spark 是 Scala 语言的计算类库,支持结构化数据文件,计算能力较强。Spark 的缺点在于缺乏解析能力,需要第三方类库的支持,不如原生类库方便稳定,比如 spark-xml 用于解析 xml,spark-excel 或 poi 用于解析 xls。Scala 语言本身也存在缺点,学习曲线远比 Java 陡峭,学习成本过高;版本稳定性差,不利于工程应用。
内嵌数据库。把文件解析后写入内嵌数据库,就可以利用 SQL 强大的计算能力,常见的有 SQLite\HSQLDB\Derby。但入库过程很繁琐,延迟很致命,整体架构也很复杂。计算能力强大也是相对的,SQL 只擅长计算二维结构的数据,不擅长计算 json\xml 这类多层结构的数据。
还有一些类库也可以计算结构化数据文件,比如 simoc csvjdbc\xiao321 csvjdb\xlsjdbc 等文件 JDBC,Tablesaw\Joinery 等 DataFrame,但因为成熟度低计算能力弱,实用价值就更小了。
相比以上类库,esProc SPL 是更好的选择。
SPL 是基于 JVM 的开源程序语言,提供了简易的解析方法以读取各类规则或不规则的 txt\csv\json\xml\xls;专业的数据对象能统一地表达二维结构数据和多层结构数据;丰富的计算函数可满足业务中的计算需求。
txt\csv
SPL 内置多种解析函数,可以用简单代码解析各类文本,并提供了丰富的计算函数,可以统一计算解析后的文本。
格式规则的文本。二维结构的文本类似数据库表,首行是列名,其他行每行一条记录,列之间用固定符号分隔。其中,以逗号为分隔符的 csv 和以 tab 为分隔符的 txt 格式最为常见。SPL 的 T 函数用一行代码就可以解析:
- s=T("D:\\data\\Orders.csv")
复制代码 格式不规则的文本,可以使用选项丰富的 import 函数。比如分隔符为双横线的文本:
- s=file("D:/Orders.txt").import@t(;,"--")
复制代码 丰富的计算函数。对于解析后的文本,SPL 可以轻松完成 SQL 式计算。
过滤:
- s.select(Amount>1000 && Amount<=3000 && like(Client,"*s*"))
复制代码 N 个工作日之后的日期:
字符串类函数,判断是否全为数字:
取子串前面的字符串:
- s.groups(year(OrderDate);sum(Amount))
复制代码 按竖线拆成字符串数组:
- join(T ("D:/data/Orders.csv"):O,SellerId; T("D:/data/Employees.txt"):E,EId)
复制代码 SPL 还支持年份增减、求季度、按正则表达式拆分字符串、拆出 SQL 的 where 或 select 部分、拆出单词、按标记拆 HTML 等大量函数。
更方便的语法。SPL 提供了函数选项,使功能相似的函数可以共用一个函数名,只用函数选项区分差别。比如 select 函数的基本功能是过滤,如果只过滤出符合条件的第 1 条记录,可使用选项 @1:
二分法排序,即对有序数据用二分法进行快速过滤,使用 @b:
- s.groups(Client;top(3,Amount))
复制代码 有序分组,即对分组字段有序的数据,将相邻且字段值相同的记录分为一组,使用 @b:
- $select year(OrderDate),sum(Amount) from D:/data/Orders.txt group by year(OrderDate)
复制代码 函数选项还可以组合搭配,比如:
结构化运算函数的参数有些很复杂,比如 SQL 就需要用各种关键字把一条语句的参数分隔成多个组,但这会动用很多关键字,也使语句结构不统一。SPL 使用层次参数简化了复杂参数的表达,即通过分号、逗号、冒号自高而低将参数分为三层:
逻辑复杂的计算。SPL 计算能力强,对于 SQL 和存储过程难以实现的有序运算、集合运算、关联计算、分步计算,SPL 通常可以轻松实现。比如,计算某支股票最长的连续上涨天数:
A1// 解析文件2=a=0,A1.max(a=if(price>price[-1],a+1,0))再比如,找出销售额累计占到一半的前 n 个大客户,并按销售额从大到小排序: AB1//解析文件2=A1.sort(amount:-1)/销售额逆序排序3=A2.cumulate(amount)/计算累计序列4=A3.m(-1)/2/最后的累计即总额5=A3.pselect(~>=A4)/超过一半的位置6=A2(to(A5))/按位置取值跨数据源计算。SPL 支持多种数据源,除了结构化数据文件,还能计算各类数据库,Hadoop、redis、Kafka、Cassandra 等各类 NoSQL。各类数据源之间可以直接进行跨源计算,比如 xls 和 txt 的关联计算:
易于应用集成
方便易用的 JDBC 接口。简单的 SPL 代码可以像 SQL 一样,直接嵌入 JAVA:
[code]Class.forName("com.esproc.jdbc.InternalDriver");Connection connection =DriverManager.getConnection("jdbc:esproc:local://");Statement statement = connection.createStatement();String str="=T(\"D:/Orders.xls\").select(Amount>1000 && Amount |