文章目录

  • SQLite适应常规基本应用场景
  • SQLite面对复杂场景尚有不足
  • SPL全面支持各种数据源
  • SPL的计算能力更强大
  • 优化体系结构
  • SPL资料

可以在Java应用中嵌入的数据引擎看起来比较丰富,但其实并不容易选择。Redis计算能力很差,只适合简单查询的场景。Spark架构复杂沉重,部署维护很是麻烦。H2\HSQLDB\Derby等内嵌数据库倒是架构简单,但计算能力又不足,连基本的窗口函数都不支持。

相比之下,SQLite在架构性和计算能力上取得了较好的平衡,是应用较广的Java嵌入数据引擎。

SQLite适应常规基本应用场景

SQLite架构简单,其核心虽然是C语言开发的,但封装得比较好,对外呈现为一个小巧的Jar包,能方便地集成在Java应用中。SQLite提供了JDBC接口,可以被Java调用:

Connection connection = DriverManager.getConnection("jdbc:sqlite::memory:");
Statement st = connection.createStatement();
st.execute("restore from d:/ex1");
ResultSet rs = st.executeQuery("SELECT * FROM orders");

SQLite提供了标准的SQL语法,常规的数据处理和计算都没有问题。特别地,SQLite已经能支持窗口函数,可以方便地实现很多组内运算,计算能力比其他内嵌数据库更强。

SELECT x, y, row_number() OVER (ORDER BY y) AS row_number FROM t0 ORDER BY x;
SELECT a, b, group_concat(b, '.') OVER ( ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS group_concat FROM t1;

SQLite面对复杂场景尚有不足

SQLite的优点亮眼,但对于复杂应用场景时还是有些缺点。

Java应用可能处理的数据源多种多样,比如csv文件、RDB、Excel、Restful,但SQLite只处理了简单情况,即对csv等文本文件提供了直接可用的命令行加载程序:

.import --csv --skip 1 --schema temp /Users/scudata/somedata.csv tab1

对于其他大部分数据源,SQLite都没有提供方便的接口,只能硬写代码加载数据,需要多次调用命令行,整个过程很繁琐,时效性也差。

以加载RDB数据源为例,一般的做法是先用Java执行命令行,把RDB库表转为csv;再用JDBC访问SQLite,创建表结构;之后用Java执行命令行,将csv文件导入SQLite;最后为新表建索引,以提高性能。这个方法比较死板,如果想灵活定义表结构和表名,或通过计算确定加载的数据,代码就更难写了。

类似地,对于其他数据源,SQLite也不能直接加载,同样要通过繁琐地转换过程才可以。

SQL接近自然语言,学习门槛低,容易实现简单的计算,但不擅长复杂的计算,比如复杂的集合计算、有序计算、关联计算、多步骤计算。SQLite采用SQL语句做计算,SQL优点和缺点都会继承下来,勉强实现这些复杂计算的话,代码会显得繁琐难懂。

比如,某只股票最长的上涨天数,SQL要这样写:

select max(continuousDays)-1
from (select count(*) continuousDays
from (select sum(changeSign) over(order by tradeDate) unRiseDays
from (select tradeDate,
case when price>lag(price) over(order by tradeDate) then 0 else 1 end changeSign from AAPL) )
group by unRiseDays)

这也不单是SQLite的难题,事实上,由于集合化不彻底、缺乏序号、缺乏对象引用等原因,其他SQL数据库也不擅长这些运算。

业务逻辑由结构化数据计算和流程控制组成,SQLite支持SQL,具有结构化数据计算能力,但SQLite没有提供存储过程,不具备独立的流程控制能力,也就不能实现一般的业务逻辑,通常要利用Java主程序的判断和循环语句。由于Java没有专业的结构化数据对象来承载SQLite数据表和记录,转换过程麻烦,处理过程不畅,开发效率不高。

前面提过,SQLite内核是C程序,虽然可以被集成到Java应用中,但并不能和Java无缝集成,和Java主程序交换数据时要经过耗时的转换才能完成,在涉及数据量较大或交互频繁时性能就会明显不足。同样因为内核是C程序,SQLite会在一定程度上破坏Java架构的一致性和健壮性。

对于Java应用来讲,原生在JVM上的esProc SPL是更好的选择。

SPL全面支持各种数据源

esProc SPL是JVM下开源的嵌入数据引擎,架构简单,可直接加载数据源,可以通过JDBC接口被Java集成调用,并方便地进行后续计算。

SPL架构简单,无须独立服务,只要引入SPL的Jar包,就可以部署在Java环境中。

直接加载数据源,代码简短,过程简单,时效性强。比如加载Oracle:

A
1 =connect("orcl")
2 =A1.query@x("select OrderID,Client,SellerID,OrderDate,Amount from orders order by OrderID")
3 >env(orders,A2)

对于SQLite擅长加载的csv文件,SPL也可以直接加载,使用内置函数而不是外部命令行,稳定且效率高,代码更简短:

=T(“/Users/scudata/somedata.csv”)

多种外部数据源。除了RDB和csv,SPL还直接支持txt\xls等文件,MongoDB、Hadoop、redis、ElasticSearch、Kafka、Cassandra等NoSQL,以及WebService XML、Restful Json等多层数据。比如,将HDSF里的文件加载到内存:

A
1 =hdfs_open(;"hdfs://192.168.0.8:9000")
2 =hdfs_file(A1,"/user/Orders.csv":"GBK")
3 =A2.cursor@t()
4 =hdfs_close(A1)
5 >env(orders,A4)

JDBC接口可以方便地集成。加载的数据量一般比较大,通常在应用的初始阶段运行一次,只须将上面的加载过程存为SPL脚本文件,在Java中以存储过程的形式引用脚本文件名:

Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
CallableStatement statement = conn.prepareCall("{call init()}");
statement.execute();

SPL的计算能力更强大

SPL提供了丰富的计算函数,可以轻松实现日常计算。SPL支持多种高级语法,大量的日期函数和字符串函数,很多用SQL难以表达的计算,用SPL都可以轻松实现,包括复杂的有序计算、集合计算、分步计算、关联计算,以及带流程控制的业务逻辑。

丰富的计算函数。SPL可以轻松实现各类日常计算:

A B
1 =Orders.find(arg_OrderIDList) //多键值查找
2 =Orders.select(Amount>1000 && like(Client,\"*S*\")) //模糊查询
3 = Orders.sort(Client,-Amount) //排序
4 = Orders.id(Client) //去重
5 =join(Orders:O,SellerId; Employees:E,EId).new(O.OrderID, O.Client,O.Amount,E.Name,E.Gender,E.Dept) //关联

标准SQL语法。SPL也提供了SQL-92标准的语法,比如分组汇总:

$select year(OrderDate) y,month(OrderDate) m, sum(Amount) s,count(1) c
from {Orders}
Where Amount>=? and Amount<? ;arg1,arg2

函数选项、层次参数等方便的语法。功能相似的函数可以共用一个函数名,只用函数选项区分差别,比SQL更加灵活方便。比如select函数的基本功能是过滤,如果只过滤出符合条件的第1条记录,可使用选项@1:

T.select@1(Amount>1000)

二分法排序,即对有序数据用二分法进行快速过滤,使用@b:

T.select@b(Amount>1000)

有序分组,即对分组字段有序的数据,将相邻且字段值相同的记录分为一组,使用@b:

T.groups@b(Client;sum(Amount))

函数选项还可以组合搭配,比如:

Orders.select@1b(Amount>1000)

结构化运算函数的参数有些很复杂,比如SQL就需要用各种关键字把一条语句的参数分隔成多个组,但这会动用很多关键字,也使语句结构不统一。SPL使用层次参数简化了复杂参数的表达,即通过分号、逗号、冒号自高而低将参数分为三层:

join(Orders:o,SellerId ; Employees:e,EId)

更丰富的日期和字符串函数。除了常见函数,比如日期增减、截取字符串,SPL还提供了更丰富的日期和字符串函数,在数量和功能上远远超过了SQL,同样运算时代码更短。比如:

季度增减:elapse@q(“2020-02-27”,-3) //返回2019-05-27

N个工作日之后的日期:workday(date(“2022-01-01”),25) //返回2022-02-04

字符串类函数,判断是否全为数字:isdigit(“12345”) //返回true

取子串前面的字符串:substr@l(“abCDcdef”,“cd”) //返回abCD

按竖线拆成字符串数组:“aa|bb|cc”.split(“|”) //返回[“aa”,“bb”,“cc”]

SPL还支持年份增减、求季度、按正则表达式拆分字符串、拆出SQL的where或select部分、拆出单词、按标记拆HTML等大量函数。

简化有序运算。涉及跨行的有序运算,通常都有一定的难度,比如比上期和同期比。SPL使用"字段[相对位置]"引用跨行的数据,可显著简化代码,还可以自动处理数组越界等特殊情况,比SQL窗口函数更加方便。比如,追加一个计算列rate,计算每条订单的金额增长率:

=T.derive(AMOUNT/AMOUNT[-1]-1: rate)

综合运用位置表达式和有序函数,很多SQL难以实现的有序运算,都可以用SPL轻松解决。比如,根据考勤表,找出连续 4 周每天均出勤达 7 小时的学生:

A
1 =Student.select(DURATION>=7).derive(pdate@w(ATTDATE):w)
2 =A1.group@o(SID;~.groups@o(W;count(~):CNT).select(CNT==7).group@i(W-W[-1]!=7).max(~.len()):weeks)
3 =A2.select(weeks>=4).(SID)

简化集合运算,SPL的集合化更加彻底,配合灵活的语法和强大的集合函数,可大幅简化复杂的集合计算。比如,在各部门找出比本部门平均年龄小的员工:

A
1 =Employees.group(DEPT; (a=~.avg(age(BIRTHDAY)),~.select(age(BIRTHDAY)<a)):YOUNG)
2 =A1.conj(YOUNG)

计算某支股票最长的连续上涨天数:

A
1 =a=0,AAPL.max(a=if(price>price[-1],a+1,0))

简化关联计算。SPL支持对象引用的形式表达关联,可以通过点号直观地访问关联表,避免使用JOIN导致的混乱繁琐,尤其适合复杂的多层关联和自关联。比如,根据员工表计算女经理的男员工:

=employees.select(gender:“male”,dept.manager.gender:“female”)

方便的分步计算,SPL集合化更加彻底,可以用变量方便地表达集合,适合多步骤计算,SQL要用嵌套表达的运算,用SPL可以更轻松实现。比如,找出销售额累计占到一半的前n个大客户,并按销售额从大到小排序:

A B
2 =sales.sort(amount:-1) /销售额逆序排序,可在SQL中完成
3 =A2.cumulate(amount) /计算累计序列
4 =A3.m(-1)/2 /最后的累计即总额
5 =A3.pselect(~>=A4) /超过一半的位置
6 =A2(to(A5)) /按位置取值

流程控制语法。SPL提供了流程控制语句,配合内置的结构化数据对象,可以方便地实现各类业务逻辑。

分支判断语句:

A B
2
3 if T.AMOUNT>10000 =T.BONUS=T.AMOUNT*0.05
4 else if T.AMOUNT>=5000 && T.AMOUNT<10000 =T.BONUS=T.AMOUNT*0.03
5 else if T.AMOUNT>=2000 && T.AMOUNT<5000 =T.BONUS=T.AMOUNT*0.02

循环语句:

A B
1 =db=connect("db")
2 =T=db.query@x("select * from sales where SellerID=? order by OrderDate",9)
3 for T =A3.BONUS=A3.BONUS+A3.AMOUNT*0.01
4 =A3.CLIENT=CONCAT(LEFT(A3.CLIENT,4), " co.,ltd.")
5  …

与Java的循环类似,SPL还可用break关键字跳出(中断)当前循环体,或用next关键字跳过(忽略)本轮循环,不展开说了。

计算性能更好。在内存计算方面,除了常规的主键和索引外,SPL还提供了很多高性能的数据结构和算法支持,比大多数使用SQL的内存数据库性能好得多,且占用内存更少,比如预关联技术、并行计算、指针式复用。

优化体系结构

SPL支持JDBC接口,代码可外置于Java,耦合性更低,也可内置于Java,调用更简单。SPL支持解释执行和热切换,代码方便移植和管理运营,支持内外存混合计算。

外置代码耦合性低。SPL代码可外置于Java,通过文件名被调用,既不依赖数据库,也不依赖Java,业务逻辑和前端代码天然解耦。

对于较短的计算,也可以像SQLite那样合并成一句,写在Java代码中:

Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
Statement statement = conn.createStatement();
String arg1="1000";
String arg2="2000"
ResultSet result = statement.executeQuery(=Orders.select(Amount>="+arg1+" && Amount<"+arg2+"). groups(year(OrderDate):y,month(OrderDate):m; sum(Amount):s,count(1):c)");

解释执行和热切换。业务逻辑数量多,复杂度高,变化是常态。良好的系统构架,应该有能力应对变化的业务逻辑。SPL是基于Java的解释型语言,无须编译就能执行,脚本修改后立即生效,支持不停机的热切换,适合应对变化的业务逻辑。

方便代码移植。SPL通过数据源名从数据库取数,如果需要移植,只要改动配置文件中的数据源配置信息,而不必修改SPL代码。SPL支持动态数据源,可通过参数或宏切换不同的数据库,从而进行更方便的移植。为了进一步增强可移植性,SPL还提供了与具体数据库无关的标准SQL语法,使用sqltranslate函数可将标准SQL转为主流方言SQL,仍然通过query函数执行。

方便管理运营。由于支持库外计算,代码可被第三方工具管理,方便团队协作;SPL脚本可以按文件目录进行存放,方便灵活,管理成本低;SPL对数据库的权限要求类似Java,不影响数据安全。

内外存混合计算。有些数据太大,无法放入内存,但又要与内存表共同计算,这种情况可利用SPL实现内外存混合计算。比如,主表orders已加载到内存,大明细表orderdetail是文本文件,下面进行主表和明细表的关联计算:

A
1 =file("orderdetail.txt").cursor@t()
2 =orders.cursor()
3 =join(A1:detail,orderid ; A2:main,orderid)
4 =A3.groups(year(main.orderdate):y; sum(detail.amount):s)

SQLite使用简单方便,但数据源加载繁琐,计算能力不足。SPL架构也非常简单,并直接支持更多数据源。SPL计算能力强大,提供了丰富的计算函数,可以轻松实现SQL不擅长的复杂计算。SPL还提供多种优化体系结构的手段,代码既可外置也可内置于Java,支持解释执行和热切换,方便移植和管理运营,并支持内外存混合计算。

SPL资料

  • SPL官网
  • SPL下载
  • SPL源代码

欢迎对SPL有兴趣的加小助手(VX号:SPL-helper),进SPL技术交流群

这是啥SQL,室友看了人傻了相关推荐

  1. 最近发现室友看电脑鬼鬼祟祟,利用python几行代码窥探室友电脑

    最近看室友电脑鬼鬼祟祟,于是我利用Python窥探到他电脑里小秘密,进来就学会: 本章福利关注!转发!私信!回复小编[资料]有大量的Python电子书以及python实现各种特效图源码和入门基础教学福 ...

  2. 选择大于努力?某程序员吐槽:自己毕业去了百度,技术不如自己的室友去了快手,如今股票1500万!...

    都说干得好不如选得好,一个程序员的亲身经历又一次印证了这一点:2015年毕业时,室友去了小厂,一年多后去了快手,股票现在1500万左右.反观自己,技术比他强很多,毕业时去了百度,今年刚来头条,股票只值 ...

  3. python断网还能用吗_室友打游戏时,让他断网掉线!明明没断网就是没网!Python黑客!...

    原标题:室友打游戏时,让他断网掉线!明明没断网就是没网!Python黑客! 为了满足新手对Python的追求,特写了三个初级Python入门工具.第一期写了三个初级工具,希望新手看完以后可以对Pyth ...

  4. 我用Python爬取1000封情书助力室友表白班花,却反转再反转...原来这就是班花的终极秘密!

    大家好,我是辣条,这是班花系列终章前的最后一篇,下一篇会完结这个系列. 前言 上次经过给班花邮箱脚本乌龙事件之后,我也心里过意不去,几次帮忙都没搞成,也快毕业了,不想给室友心中留有遗憾,是男人总得自己 ...

  5. OSChina 周二乱弹 ——室友开始买假发女装了

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @for_  :分享满汉全席的单曲<还不是因为你长得不好看> ...

  6. 室友在宿舍玩游戏我学java_在宿舍写代码总被一个室友认为在装逼,该怎么办?...

    我也跟题主有同感,我以前学过点,以为能进地狱副本,跟室友并肩作战,建功立业, 没想到,直接被分到新手村里了. 在寝室里,我永远是起的最早,睡的最晚那位.我也是,每天都在做算法题,张口闭口二叉树,图啊, ...

  7. 聊聊大学室友在 TikTok 的工作和生活体验

    关注公众号 前端开发博客,领27本电子书 回复加群,自助秒进前端群 今年由于各种因素的影响,"润"这个词成为了大家讨论的热点,有的人想润去外企,有的人想润出国,润似乎成为了我们逃离 ...

  8. OSChina 周四乱弹 ——今天家里只有我和女室友,我想……

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @爱漫爱 :再听一遍肖邦第一叙事曲: <第一叙事曲>- 肖邦 ...

  9. 同样嗑B站6个月,被室友吊打 35K Offer!

    问你个问题:作为码农,你第一份工作能拿到多少K月薪? 我猜你肯定会说,得看个人能力.没错,但我得补充一条,更重要的是工种! 最近成功跳槽到字节,终面谈好35K,而且是18薪,终于拿到了人生的第一个60 ...

  10. 拉我室友打了一把英雄联盟搞会了IntelliJ IDEA的安装与配置

    xdm,马上开学了,上次的jdk开发工具安装好了,点赞也过10个,这不马上安排,本期文章也是,点赞超过10个,安排下一个. 推荐阅读: 一.我室友又打了一把王者我搞会了Java1.8安装步骤 Inte ...

最新文章

  1. 那些总是写“烂代码”的同学,强烈推荐你使用这款IDEA插件!
  2. SecureCRT连接时总是提示数据库中没有找到防火墙
  3. IO 模拟 1/2 Bias、1/4 Duty的 LCD 驱动
  4. java 的tree_Java TreeSet higher()方法
  5. Instagram视频上传延迟优化
  6. codeforces Round #320 (Div. 2) C. A Problem about Polyline(数学) D. Or Game(暴力,数学)
  7. php ajax 懒加载demo,lazyload懒加载,怎么支持ajax获得的新内容?
  8. wiki源码_一个轻量级的企业Wiki和团队知识分享平台:MM-Wiki搭建教程
  9. 亚马逊EC2服务器使用Rsync+Inotify实时同步
  10. 如何批量修改图片宽高尺寸
  11. 全国第三次土壤普查实验室筛选开始 实验室要求理化检测指标仪器一览
  12. Word中公式编辑的快捷键
  13. Linux之奇怪的知识---supervisor超级守护进程的意义和使用方法
  14. C++ 常函数和常对象
  15. oracle重做日志教程,Oracle重做日志管理
  16. linux 动态库文件stripped属性理解
  17. linux查看msg内容,如何打开MSG文件,如何转换MSG文件
  18. 修改cmd命令行窗口的颜色
  19. 308 permanent redirect怎么解决_「网站」WordPress网站更改固定链接以后怎么解决404错误...
  20. Windows 7安装ArcGIS DeskTop10:错误1935,处理办法

热门文章

  1. java 杨辉三角_JAVA实现杨辉三角的三种方式
  2. 业务部门战略规划与支撑部门战略规划
  3. 南洋生活,聊聊新加坡的房地产
  4. 计算机用word做贺卡,运用Word制作电子贺卡教学设计
  5. java查询ip归属地
  6. [论文写作] Wrong vs Mistake vs Error vs Incorrect vs Erroneous
  7. 桌面计算机未响应,电脑软件总是未响应 电脑应用程序经常无响应,
  8. K-median 算法
  9. 网站建设及上线的详细步骤(原创)
  10. ArcGIS中将经纬度表格转为空间图层并制作采样点分布图