开源SPL重新定义OLAP Server

OLAP(Online Analytical Processing)是指在线联机分析,基于数据查询计算并实时获得返回结果。日常业务中的报表、数据查询、多维分析等一切需要即时返回结果的数据查询任务都属于OLAP的范畴。对应的,行业内也有相应产品来满足这类需求,那就是OLAP Server。

OLAP Server现状

当前主流OLAP Server几乎都是基于RDB或封装成RDB的大数据平台,有点类似早期的ROLAP(这个词已经很少被提及了),其中一个关键的特征是使用SQL作为查询语言。

RDB和SQL的特性会给OLAP Server带来诸多困难。

复杂报表困难

事实上,报表才是OLAP业务的重头戏,OLAP的查询需求中有相当大一部分都是事先做好的报表查询界面,而不是自由拖拽的多维分析,而复杂报表又经常占据报表需求的一半以上。这类报表的典型特点是数据处理逻辑复杂,每个报表都需要单独编写代码进行数据准备,最常见的做法是使用复杂SQL或存储过程,如果碰到一些数据库无法实现的场景(如文件等外部数据源、跨数据源计算、前后端分离等)还需要通过JAVA完成,过程十分繁琐。

SQL实现这些计算很难,存储过程也有很多缺点(无移植性、有安全隐患等)导致越来越少使用,Java集合运算困难且无法热切换而难以适应复杂多变的报表需求。当前OLAP Server在复杂报表这方面就表现的很不理想了。

自助关联差

即使不管复杂报表,只考虑多维分析的这种基础的OLAP任务,使用SQL作为查询语言时也很难胜任,只能解决一小部分无关联的单表分析,满足一些相对固定的多维分析需求,适用范围很小,难以适应灵活的自助分析场景。

体系封闭

当前OLAP Server严重依赖数据库,数据库有“库”的概念,数据只有“入库”才能处理,而且通常只能同时处理一个数据库,无法同时计算数据库外部的数据。而OLAP名为在线分析,业务上还要求做T+0式的实时查询分析。其他数据源的数据需要先ETL到数据库中才能计算,这就造成了不实时。典型的场景是OLAP业务经常要查询业务库的实时数据,要将实时数据(业务库)和历史数据(分析库)混合查询分析(T+0查询),这是当前OLAP Server难以满足的。何况还有很多非关系数据库的数据也无法被OLAP Server直接计算。

性能低

退一步来讲,即使只关注历史数据,不考虑实时生产数据,也只使用单一的数据库,当前OLAP查询也面临性能低的问题,我们经常会遇到查询报表要等几分钟、实时查询不实时、多维分析卡顿的情况。根本原因仍然是SQL的问题,基于关系代数理论的SQL难以实现高性能算法,仅靠数据库在工程上优化并不能根本解决问题,SQL复杂时数据库优化经常无效而导致性能仍然很低。

开源SPL重新定义OLAP Server

SPL技术问世之后,将使OLAP Server的上述窘境大为改观。

SPL是结构化数据计算专用程序语言(Structured Process Language)的简称。SPL提供丰富的计算类库和敏捷的开发语法可以快速完成各类复杂数据处理;SPL的计算能力不依赖于数据库(数据源),天然支持多样性数据源,可以完成跨数据源混合计算,实现跨异构源的实时查询;SPL内置了大量高性能算法和存储方案以及并行计算机制保证计算的高性能。

敏捷的过程计算适应复杂报表

在复杂数据处理方面,SPL提供独立的敏捷语法支持过程计算,相对于SQL,SPL的语法更简洁,适合完成复杂报表数据准备。

比如要计算:一只股票最长连续上涨了多少天?

用SQL借助窗口函数还要写成四层嵌套的语句:

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 changeSignfrom stock) )group by unRiseDays)

而同样的逻辑用SPL写要简单得多:

A
1=T(“/dw/stockRecord.txt”)
2=A1.group@i(closePrice<   closePrice[-1]).max(~.len())

SPL提倡分步运算,复杂计算可以按照自然思维一步一步实现。

image

再借助SPL丰富的计算类库可以大幅简化数据处理难度。

image

针对SQL的调试困难,SPL还提供了简洁易用的开发环境,单步执行、设置断点,所见即所得的结果预览窗口…

image

业务开展过程中报表会不断新增、修改。使用报表工具可以解决报表呈现模板的快速制作,但却无法应对复杂多变的报表数据准备,以往无论使用SQL/存储过程还是Java都难以很好应对。

使用SPL完成报表数据准备,可以实现报表数据准备工具化,加之原有呈现端的报表工具,使报表开发全面工具化,从而低成本、快速地应对没完没了的报表。

SPL是解释执行的程序语言,天然支持热切换。报表(数据准备)修改无需重启服务即可生效,以适应不断修改的报表需求。

不仅如此,借助SPL敏捷和易切换特性,还可以很好与微服务等开发框架融合。SPL提供不依赖数据库的计算能力,算法外置完成微服务数据处理,相对Java硬编码也更有优势,能有效降低应用各个模块间的耦合性。

体系开放

相对传统OLAP Server的封闭性,基于SPL实现的OLAP Sever体系则更加开放。SPL的计算不依赖于数据库,也不再有“库”的限制,甚至没有“库“的概念。无论什么数据源都可以直接使用,CSV、Excel、JSON/XML、NoSQL、RestAPI、HDFS、Kafka、Elasticsearch、SAP均能支持,还可以进行混合计算。数据源可以来自本地应用系统,也可以是外部系统或者远程云应用。

这种开放的计算体系能很方便完成T+0实时数据查询,同时连接存储热数据的业务库和存储冷数据的分析库(或文件)进行混合计算即可实现T+0。

高性能

SPL没有基于关系代数理论,而是创新地发明了离散数据集代数。这样,很多SQL很难实现的高性能算法及存储方案用SPL却可以轻松实现,而软件提高性能关键就在于算法和存储。

例如,SPL支持更彻底的集合化,可以把TopN理解为聚合运算,这样可以将高复杂度的排序转换成低复杂度的聚合运算,而且很还能扩展应用范围。

A
1

=file(“data.ctx”).create().cursor()

2

=A1.groups(;top(10,amount))

金额在前10名的订单

3

=A1.groups(area;top(10,amount))

每个地区金额在前10名的订单

SQL描述上面的运算会涉及大排序,性能非常低下,只能寄希望于数据库的优化。但在稍复杂的情况(比如A3中伴随分组运算)数据库优化器就会失效。

再比如,SPL的游标支持复用,可以在一次遍历中聚合出多个结果。

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()取出复用运算的结果

而SQL无法描述这种算法,实现上述运算就会不可避免地将大数据遍历多次,造成性能低下。而且这个问题还是理论层面的,数据库优化引擎无能为力。

SPL提供的其它与OLAP业务相关性能优化技术还有:有序归并实现订单和明细之间的关联、预关联技术实现多维分析中的多层维表关联、位存储技术实现上千个标签统计、布尔集合技术实现多个枚举值过滤条件的查询提速、时序分组技术实现复杂的漏斗分析,倍增分段存储技术实现列存的平滑并行、…。其中有相当一部分是SPL发明的算法。

用TPCH国际标准实测,SPL能在低性能ARM芯片上跑出比高性能Intel芯片上Oracle快出数倍的成绩,这就是创新算法带来的优势。。

在SPL的高性能算法和存储方案的支持下,历史大数据的计算会获得更高的性能,配合实时业务热数据进行混合查询还可以进一步提升T+0查询效率。

关联查询

针对传统OLAP Server多维分析时关联能力差的问题,基于SPL还发展了一种关联查询分析语法DQL。DQL(Dimensional Query Language)是以维度为核心的类SQL查询语言在解决表间关联问题时采用了与SQL不同的思路。

当前基于SQL的OLAP Server在实现多表关联时并没有特别好的办法,要么采用逻辑宽表,但由于会产生过多字段(维表字段会被复制多次,多层关联、自关联、循环关联都会加剧这种情况)导致用户无法使用,而且性能也很差。有些BI产品可以根据用户选择的字段在页面上自动关联,但只适用简单的的情况,当遇到同维字段(如同一个表有2个以上地区字段)时就无法匹配了,自关联的情况也没法处理。将表和字段都开放给用户让用户自己关联显然更不现实。

那么DQL是如何处理的呢?比如这样一句SQL:

--SQL
SELECT A.* FROM EMPLOYEE A, DEPARTMENT B, EMPLOYEE CWHERE A.country='USA'AND C. country ='China'AND A. dept_id =B. dept_idAND B.  manager=C.  emp_id

其中涉及多表和自关联,很难让业务用户在BI界面中正确地描述出其中的关联关系。

而同样的查询用DQL写出来是这样:

--DQL
SELECT * FROM EMPLOYEE
WHERE country ='USA' AND dept_id.manager.country ='China’

将复杂的多表关联转换成了简单的单表查询,普通业务用户都能理解并在界面中自行实施。

总结

SPL及DQL的问世,将对OLAP Server产生深刻的影响。

基于SPL的敏捷性(过程计算、算法外置、解释执行)可以很好适应OLAP业务中复杂报表的需要,快速开发、热切换、低耦合可以很好与微服务融合;开放的计算体系以及无约束数据组织形式打破了传统OLAP产品的封闭性,可以直接使用各类数据源,轻松实现T+0查询;通过基于SPL的DQL则可以解决多维分析时的实时关联查询的难题;SPL的高性能算法和存储技术则保证了OLAP运算性能,高效完成报表查询、T+0查询、多维分析等查询分析任务。

我们期待基于SPL技术的新一代OLAP Server以及BI 产品的出现。

SPL资料

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平层、错层、跃层、复式、loft的区别是什么?

平层正如字面上的理解&#xff0c;是所有功能厅都在同一个水平面上。平时我们所见的户型&#xff0c;都是平层。错层室内各功能用房在不同的平面上&#xff0c;用2-4个台阶进行隔断。跃层是两层的住宅&#xff0c;在室内会设计一条楼梯连接上下两层&#xff0c;功能区会分开。复…

C#集合类型总结和性能分析

C#集合类型概述 集合是.NET FCL(Framework Class Library)中很重要的一部分。所有的集合类都继承自IEnumerable。集合类总体可分为一下几类&#xff1a;关联/非关联型集合&#xff0c;顺序/随机访问集合&#xff0c;顺序/无序集合&#xff0c;泛型/非泛型集合&#xff0c;线程…

Spring AOP(通知、连接点、切点、切面)

一、AOP术语 通知&#xff08;Advice&#xff09;   切面的工作被称为通知。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作&#xff0c;通知还解决了何时执行这个工作的问题。 5种通知类型&#xff1a;前置通知&#xff08;Before&#xff09;&#xff1a;在…

C#中几种常用的集合的用法

集合:将一推数据类型相同的数据放入到一个容器内&#xff0c;该容器就是数组&#xff1a;内存中开辟的一连串空间。 非泛型集合 ArrayList集合&#xff1a; ArrayList是基于数组实现的&#xff0c;是一个动态数组&#xff0c;其容量能自动 增长 ArrayList的命名空间System.…

C#使用Redis的基本操作

一&#xff0c;引入dll 1.ServiceStack.Common.dll 2.ServiceStack.Interfaces.dll 3.ServiceStack.Redis.dll 4.ServiceStack.Text.dll 二&#xff0c;修改配置文件 在你的配置文件中加入如下的代码&#xff1a; <appSettings><add key"RedisPath" value…

Navicat将mysql表结构导成oracle表结构

1&#xff0c;选中对应的表右键逆向表到模型 2.点击右上角文件转换模型为 3.模型选择物理&#xff0c;数据库oracle&#xff0c;选择对应的版本 4.新弹出的模型点击右上角文件&#xff0c;导出sql 5.选择路径导出sql

程序员们的三高:高并发、高性能、高可用

你们知道淘宝&#xff0c;京东这些购物商场吗&#xff1f;他们到了双11&#xff0c;双12为什么能支持全国14亿人口同时购物下单呢&#xff0c;因为他们的程序做到了高并发、高性能、高可用。那么你对程序员的三高了解多少呢&#xff1f; 高并发 一. 高并发 高并发是现在互联…

char 和 varchar 的区别,数据库索引B+树

char 和 varchar 的区别 char(n) &#xff1a;固定长度&#xff0c;效率高&#xff1b;缺点&#xff1a;占用空间&#xff1b;存储固定长度的&#xff0c;使用 char 非常合适。 varchar(n) &#xff1a;可变长度&#xff0c;存储的值是每个值占用的字节再加上一个用来记录其长…

C#基础操作符详解

本节内容&#xff1a; 1.操作符概览&#xff1b; 2.操作符的本质&#xff1b; 3.操作符与运算顺序 4.操作符详解。 1.操作符概览&#xff1a; 操作符&#xff08;Operator&#xff09;也译为”运算符” 操作符是用来操作数据的&#xff0c;被操作符操作的数据称为操作数&a…

C# 有什么惊艳到你的地方?

作者&#xff1a;皮皮关 链接&#xff1a;https://www.zhihu.com/question/335137780/answer/786853293 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 很多游戏开发者都是由于Unity而“被迫”使用C#的。但用过一段…

SqlServer学习之存储过程

前言&#xff1a;对于存储过程一直有一种抵触的心理&#xff0c;因为毕业至今所在的公司开发组都不是很规范&#xff0c;对于开发的一些注意事项并没有很多的规定&#xff0c;只是在知乎上查找相关知识的时候&#xff0c;看到很多人对于在程序里使用存储过程的不好之处都有很多…

中间件之RPC

一、RPC的定义 1、RPC(Romote Procedure Call)&#xff1a;远程过程调用&#xff0c;允许一台计算机程序远程调用另外一台计算机的子程序&#xff0c;不用关心底层网络通信 2、应用&#xff1a;分布式网络通信 3、在Socket的基础上实现&#xff0c;比socket需要更多资源 4、…

需求分析之UML用例图学习

用例图常用的三种关系浅析&#xff1a; &#xff08;一&#xff09;泛化(Inheritance) 通常理解的继承关系 &#xff08;二&#xff09;包含&#xff08;include&#xff09; 分解功能&#xff0c;一定包含的功能 &#xff08;三&#xff09;拓展(extend) 附加功能&#xff0c…

UML之用例图(use case)箭头方向

1、Association&#xff0c;无箭头&#xff0c;Actor连接UseCase即可&#xff1b; 2、DirectedAssocition&#xff0c;Actor连接UseCase&#xff0c;箭头由Actor指向UseCase&#xff08;角色指向用例&#xff09;&#xff1b; 3、Generalization&#xff0c;继承&#xff0c;…

UML-记忆技巧

箭头方向 UML箭头方向&#xff1a;从子类指向父类&#xff0c;读作继承自定义子类时需要通过extend关键字指定父类子类一定时知道父类定义的&#xff0c;但父类并不知道子类的定义 只有知道对方信息时才能指向对方 image.png 实现-继承|虚线-实现 空心三角箭头&#xff1…

国密算法SM2,SM3,SM4-java实现

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法&#xff0c;基于ECC。其签名速度与秘钥生成速度都快于RSA&#xff0c;非对称加密&#xff0c;该算法已公开 SM3是中华人民共和国政府采用的一种密码散列函数标准&#xff0c;由国家密码管理局于2010年12月17日…

数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)

一、数据库事务隔离级别 数据库事务的隔离级别有4个&#xff0c;由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable &#xff0c;这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。 √: 可能出现 : 不会出现 脏读不可重复读幻…

原子性和一致性的区别是什么?

注&#xff1a; 重度参考了&#xff1a;https://www.zhihu.com/question/30272728/answer/72476703&#xff08;讲的非常好&#xff0c;逻辑清晰&#xff09; 轻度参考了&#xff1a;https://www.cnblogs.com/fjdingsd/p/5273008.html&#xff08;概念也比较清晰&#xff0c;…

什么是事务、事务特性、事务隔离级别、spring事务传播特性

1.什么是事务&#xff1a; 事务是指程序中的一个操作序列。其特点是&#xff1a;该序列的所有操作要么全部成功完成&#xff0c;要么只要有一个操作失败&#xff0c;则该序列所有操作都将被撤销。这也是事务的原子性&#xff08;要么成功&#xff0c;要么失败&#xff09;。 …

软件工程 – 开发模型

软件工程 – 开发模型 为了指导软件开发&#xff0c;可以用不同的方式将软件生命周期中的所有开发活动组织组织起来从而形成不同的开发模型。 瀑布模式 瀑布模型严格遵守软件生命周期各阶段的固定顺序:计划、分析、设计、编程、测试和维护&#xff0c;上一阶段完成才能进入到…