SQL在使用窗口函数的情况下嵌套三层完成;
前面读懂了吗?
当前处理结构化数据的程序语言主要有三类:
SQL基于50年前的 关系代数 理论 | SPL基于自创 离散数据集 理论 |
---|---|
缺乏离散性、集合化不彻底 | 离散与集合的充分结合 |
有序计算支持得很不好 | 超强有序计算 |
不提倡分步计算 | 提倡分步计算 |
➥对于复杂运算的代码冗长难写 | ➥擅长实现复杂运算 |
难以实现高性能算法 | 高性能基础算法和存储机制 |
➥无法充分利用硬件能力 | ➥充分利用硬件能力 |
封闭,只能计算数据库中的数据 | 开放,可以计算任意数据源 |
SQL有一定的计算能力,但很多场景下没有SQL用,只能编写复杂的Java代码。SPL提供了不依赖于数据库的轻量级计算能力,可以在任意场景处理数据:
可以通过SPL原生语法进行文件计算,同时支持SQL查文件,简单方便
SPL可以强化MongoDB计算能力,
简化计算过程
SPL提供不依赖数据库的计算能力,完成各类数据源的后计算工作
对于复杂的集合和有序运算很难处理,常常还要读出来再用Java计算。SPL有彻底的集合化能力,特别支持有序和分步计算,可以简化这些运算:
select max(continuousDays)-1 from (select count(*) continuousDays from (select sum(changeSign) over(order by tradeDate) unRiseDays from (select tradeDate, case when closePrice>lag(closePrice) over(order by tradeDate) then 0 else 1 end changeSign from stock) ) group by unRiseDays)
SQL在使用窗口函数的情况下嵌套三层完成;
前面读懂了吗?
A | |
1 | =stock.sort(tradeDate) |
2 | =0 |
3 | =A1.max(A2=if(closePrice>closePrice[-1],A2+1,0)) |
其实这个计算很简单,按照自然思维:先按交易日排序(行1),然后比较当天收盘价比前一天高就+1,否则就清零,最后求个最大值(行3)
WITH TT AS (SELECT RANK() OVER(PARTITION BY uid ORDER BY logtime DESC) rk, T.* FROM t_loginT) SELECT uid,(SELECT TT.logtime FROM TT where TT.uid=TTT.uid and TT.rk=1) -(SELET TT.logtim FROM TT WHERE TT.uid=TTT.uid and TT.rk=2) interval FROM t_loginTTTT GROUP BY uid
聚合函数返回值不一定是单值,也可以返回一个集合
彻底的集合化后很容易针对分组子集实施返回集合的聚合运算
A | ||
1 | =t_login.groups(uid;top(2,-logtime)) | 最后2个登录记录 |
2 | =A1.new(uid,#2(1).logtime-#2(2).logtime:interval) | 计算间隔 |
WITH B AS (SELECT LAG(amount) OVER (ORDER BY 月份) f1, LEAD(amount) OVER (ORDER BY smonth) f2, A.* FROM orders A) SELECT smonth,amount, (NVL(f1,0)+NVL(f2,0)+amount)/(DECODE(f1,NULLl,0,1)+DECODE(f2,NULL,0,1)+1) moving_average FROM B
窗口函数只有简单的跨行引用,涉及集合要用成员去拼
有序集合上可提供跨行集合引用方案
A | |
1 | =orders.sort(smonth).derive(amount[-1,1].avg()):moving_average) |
SELECT max(consecutive_days)-1 FROM (SELECT count(*) consecutive_days FROM (SELECT SUM(updown_flag) OVER ( ORDER BY trade_date) nonrising_days FROM ( SELECT trade_date, CASE WHEN close_price>LAG(close_price) OVER( ORDER BY trade_date THEN 0 ELSE 1 END updown_flag FROM stock )) GROUP BY nonrising_days )
另一种和次序有关的分组,条件成立时产生新组
A | |
1 | =stock.sort(trade_date).group@i(close_price<close_price [-1]).max(~.len()) |
数据库的计算能力是封闭的,无法处理数据库外的数据,常常需要先做ETL导入同一个数据库后才能处理。 SPL提供了开放简易的计算能力,可以直接读取多个数据库实现混合数据计算,协助数据库做更好的运算。
SPL辅助RDB计算,提升RDB能力
借助SPL的跨库与并行能力实现多数据库集群计算
传统ETL往往先L再ET,费时费力;通过SPL可以实现真正的ETL过程
微服务的数据处理往往要依靠Java硬编码,复杂计算实现困难。
SPL与微服务框架结合实施数据处理比其他开发语言更简洁、高效。
SQL难以实现高性能算法,大数据运算性能只能指望数据库的优化引擎,但复杂情况常常靠不住。
SPL提供大量基础高性能算法(有许多是业界创新)以及高效的存储格式,同等硬件环境下可以获得远超过数据库的运算性能,可以全面替代大数据平台与数据仓库。
没有火药,无论如何也造不出枪炮
SQL很难实现高性能结构化数据计算
好算法不光要想出来,还要能实现
这里许多算法都是开源SPL的发明!
A | ||
1 | =file("data.ctx").create().cursor() | |
2 | =A1.groups(;top(10,amount)) | 金额在前10名的订单 |
3 | =A1.groups(area;top(10,amount)) | 每个地区金额在前10名的订单 |
高复杂度的排序转换为低复杂度的聚合
A | ||
1 | =file("order.ctx").create().cursor() | 准备遍历 |
2 | =channel(A1).groups(product;count(1):N) | 配置复用计算 |
3 | =A1.groups(area;sum(amount):amount) | 遍历,并获得分组结果 |
4 | =A2.result() | 取出复用运算的结果 |
一次遍历可返回多个结果集
硬件配置:Intel3014 1.7G/12核/64G内存;ARM/16核/32G内存
手机银行、网银几十万、上百万并发明细查询
明细与机构等维表关联无法实现,要宽表冗余
维表数据调整,要全量更新宽表数据
上亿客户与几千客群多对多关系,几十个维度
几千个客群,任选几个交叉,排列组合太多
数据库实时算交集并维度过滤,不能秒级响应
分析处理Excel的三种方式
八成以上数据处理和计算的需求无法用可视化工具完成
SPL与Excel配合可以增强Excel计算能力,降低计算实施难度
通过SPL的Excel插件可以在Excel中使用SPL函数进行计算,也可以在VBA中调用SPL脚本
工业场景中有大量时序数据,而时序数据库常常只提供SQL,SQL的有序计算能力本来很弱,结果只用于取数,无法协助计算。
工业场景中还常常会涉及许多基础数学运算,SQL缺乏这些函数,只能读出来再处理。
SPL能很好地支持有序计算,而且提供了丰富的数学函数,如矩阵、拟合等,能够更方便地应对工业场景的计算需求。
工业算法常常需要反复实验,SPL开发效率极高,同时间内可以尝试更多:
背景:炼油厂希望从历史数据中学到相对准确的产品收率,并利用它来制定第二天或者未来一段时间的原料加工及产品产量计划
目标:使用线性拟合的方式在有约束条件的情况下,利用历史生产数据拟合出一套系数(称为收率),使拟合收率计算得到的产品产量与实际产量的误差尽量小
时间序列走势在一定程度上反应实际生产状况,称为工况。如曲线走势平稳表示正常,快速上升或快速下降表示可能有异常情况发生。将曲线走势与工况对应,有助于分析生产活动中存在的问题,提高生产效率
炼油厂通常有几十套装置,每套装置的仪表数量是成百上千的,无法依靠人工观察发现异常,需要相应算法来识别
SPL特别适合复杂过程运算
专门针对结构化数据表设计
直接使用多个数据源混合计算,无需后台先将数据统一(ETL)后再计算
SPL使用JAVA开发,提供标准应用接口可无缝集成到应用中
SPL解释执行,支持不停机热切换
方便地针对单任务实施多线程计算
私有数据存储格式,集文件、组表
支持以树状目录方式按业务分类存储数据
提供内外存两种数据容错机制,外存冗余式容错,内存备胎式容错
支持计算容错,节点故障时自动将该节点计算任务迁移掉其他节点继续完成
用户可根据数据和计算任务的特点灵活定制数据分布及冗余方案,有效减少节点间数据传输量,以获得更高性能
集群没有永久的中心主控节点,程序员用代码控制参与计算的节点
根据每个节点空闲程度(线程数量)决定是否分配任务,实现负担和资源的有效平衡
离散数据集超越关系代数
SPLoverSQL