- 跑批任务提前完成,从容应对后续任务
- 查询报表秒出,优化用户体验
- 预计算成为历史,改变业务模式
面向线下跑批、在线查询等数据计算场景
采用SQL语法的、应用于OLAP场景的数据库
其它数据分析与统计技术
SELECT TOP 10 * FROM Orders ORDER BY Amount DESC
这个查询用了ORDER BY,严格按此逻辑执行,意味要将全量数据做排序,性能将很差
我们知道有不必全排序而完成这个运算的办法,但用SQL无法描述,只能寄希望于数据库的优化引擎
简单情况(比如本句),很多数据库都能优化,但情况再复杂一些,数据库优化引擎就会晕了
下面的分组内取前N名,SQL无法直接描述了,还是要采用迂回思路利用窗口函数写成子查询
面对这种迂回写法,数据库优化引擎也不会优化了,只能去执行排序
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Area ORDER BY Amount DESC) rn
FROM Orders )
WHERE rn<=10
SELECT MAX(ContinuousDays)
FROM (SELECT COUNT(*) ContinuousDays
FROM (SELECT SUM(UpDownTag) OVER ( ORDER BY TradeDate) NoRisingDays
FROM (SELECT TradeDate,
CASE WHEN Price>LAG(price) OVER ( ORDER BY TradeDate)
THEN 0 ELSE 1 END UpDownTag
FROM Stock ) )
GROUP BY NoRisingDays )
SQL对有序运算支持不足,未直接提供有序分组,只能采用迂回思路,写成四层嵌套的形式
这样的句子不仅很难写出来,写出来想看懂也不容易
面对复杂的业务逻辑,SQL的复杂度会陡增,既难懂又难写
这并非罕见需求,现实中数千行的SQL代码中这种情况比比皆是,严重影响开发和维护效率
| A | ||
| 1 | =file(“Orders.ctx”).open().cursor() | |
| 2 | =A1.groups(;top(10;-Amount)) | 金额在前10名的订单 |
| 3 | =A1.groups(Area;top(10;-Amount)) | 每个地区金额在前10名的订单 |
SPL将TopN视为返回集合的聚合运算,避免全排序;全集和分组时写法类似,不再迂回
| A | |
| 1 | =Stock.sort(TradeDate).group@i(Price< Price[-1]).max(~.len()) |
股票连涨:这句SPL和前面SQL的运算逻辑相同,但SPL提供有序分组运算,描述起来直观简洁
WITH DT AS ( SELECT DISTINCT id, ROUND(tm/900)+1 as tn, loc FROM T WHERE tm< 3*86400)
SELECT * FROM (
SELECT B.id id, COUNT( DISINCT B.tn ) cnt
FROM DT AS A JOIN DT AS B ON A.loc=B.loc AND A.tn=B.tn
WHERE A.id=a AND B.id<>a GROUP BY id )
ORDER BY cnt DESC LIMIT 20
| A | |
| 1 | >NL=100000,NT=3*96 |
| 2 | =file("T.ctx").open() |
| 3 | =A2.cursor(tm,loc;id==a).fetch().align(NL*NT,(loc-1)*NT+tm\900+1) |
| 4 | =A2.cursor@mv(;id!=a && A3((loc-1)*NT+tm\900+1)) |
| 5 | =A4.group@s(id;icount@o(tm\900):cnt).total(top(-20;cnt)) |
无需Server,集算器 JDBC具备独立计算能力,嵌入应用计算
极其与众不同的特点
Server模式,独立部署,支持集群,提供负载均衡和容错机制
计算能力全部在集算器内部 ,不是翻译成SQL,也不可能
所有数据源逻辑等同,集算器不拥有数据(仅计算),天然存算分离
没有库内库外概念,无须入库出库动作
集算器拥有独立且完备计算能力,不依赖数据源,任何数据源都能读取并混合计算
| A | |
| 1 | =connect("mysql") |
| 2 | =A1.query@x("SELECT o.order_id, o.user_id, o.order_date, oi.product_id, oi.quantity, oi.price FROM orders o JOIN order_items oi ON o.order_id = oi.order_id WHERE o.order_date >= CURDATE() - INTERVAL 1 MONTH") |
| 3 | =mongo_open("mongodb://127.0.0.1:27017/raqdb") |
| 4 | =mongo_shell@d(A3, "{ 'find': 'products', 'filter': { 'category': { '$in': ['Tablets', 'Wearables', 'Audio'] } }}” ) |
| 5 | =A2.join@i(product_id,A4:product_id,name,brand,category,attributes) |
| 6 | =A5.groups(category;sum(price*quantity):amount) |
| A | |
| 1 | =connect("mysql") |
| 2 | =A1.cursor@x("SELECT o.order_id, o.user_id, o.order_date, oi.product_id, oi.quantity, oi.price FROM orders o JOIN order_items oi ON o.order_id = oi.order_id WHERE o.order_date >= CURDATE() - INTERVAL 1 MONTH ORDER BY oi.product_id ASC") |
| 3 | =mongo_open("mongodb://127.0.0.1:27017/raqdb") |
| 4 | =mongo_shell@dc(A3,"{ 'find': 'products', 'filter': {}, 'sort': { 'product_id': 1 }}") |
| 5 | =joinx(A2:o,product_id;A4:p,product_id) |
| 6 | =A5.groups(p.category;sum(o.price*o.quantity):amount) |
数据以文件格式缓存,充分保障计算性能
二进制文件,结构简单,无需定义结构
数据转储中介、临时存储、 小数据存储
行列混合存储,支持索引,需事先定义结构
大数据存储、高性能计算
| A | |
| 1 | =connect(“db") |
| 2 | =A1.query@x("SELECT AREAID,AREANAME FROM AREA ORDER BY AREAID") |
| 3 | =file("area.btx").export@b(A2) |
| A | |
| 1 | =connect(“db") |
| 2 | =A1.cursor("select ORDERID,CUSTOMERID,EMPLOYEEID,AREAID,AMOUNT,ORDERDATE from ORDERS") |
| 3 | =file("orders.ctx").create@y(ORDERID,CUSTOMERID, EMPLOYEEID,AREAID,AMOUNT,ORDERDATE) |
| 4 | =A3.append(A2) |
| 5 | >A1.close(),A3.close() |
集算器基于全新的计算模型,无开源技术可以引用,从理论到代码全部自主创新
基于创新理论的集算器不能再使用SQL实现高性能,SQL无法描述大部分低复杂度算法
集算器 完全用纯Java开发,可以在任何有JVM的操作系统下运算,包括虚拟机、云服务器以及容器,甚至可以运行在Android 上。
集算器 提供了标准的JDBC驱动,可被Java应用无缝集成调用。
对于非Java应用,集算器提供了HTTP/RESTFul调用接口。
作为拥有良好集成性的Java产品,可以无缝与各种 Java 框架和应用服务器集成使用,其逻辑地位与自写的Java代码等同
对于计算型框架(比如 Spark),虽然集算器能被无缝集成,但并没有实际意义,集算器可以替代Spark计算
特别地,集算器自有流式计算能力,不需要被流计算框架(比如 Flink)集成,通常会更好的功能和性能
当然没问题! 集算器 支持几乎所有业界中常见的数据源,可以直接使用数据源本身的接口和语法,不需要将数据源映射成关系数据库表。
不过,因为数据库I/O性能不佳, 集算器这时不能保证高性能, 而且数据库或其他数据源通常也不提供低复杂度算法需要的存储。要获得高性能,推荐使用集算器的自有格式文件来存储。
集算器不拥有数据,原则上并不负责数据存储,可访问到的数据都可以计算。
特别地,集算器对文件支持非常好,数据文件可以存储在任何文件系统中,包括网络文件系统和云上对象存储。,天然实现存算分离机制。
嵌入应用使用时,可靠性由应用保障
独立使用时,提供负载均衡和容错机制,但单任务可能失败,仅适合小规模集群
不提供故障后自动恢复功能
云版本的弹性计算机制在分配 VM 时会避开当前失效的节点,一定程度实现高可用
可使用提供的接口,调用 Java 写的静态函数来扩展功能
集算器也开放了自定义函数的接口,注册后即可在SPL中使用
和RDB相比
集算器没有元数据,大部分计算要从访问数据源(文件)开始,对于特别简单的运算反而会有些麻烦。
和Hadoop/MPP相比
集算器提供有集群能力,但缺乏机会历练。
历史上,集算器多次用单机替代原有的集群,仍获得同样甚至更高的性能。
和Python相比
SPL 正在发展人工智能类库,但目前和Python相差还比较远。
SPL不是 SQL 体系的计算引擎,目前仅支持小数据量下的简单SQL且不保障性能。可以认为集算器不支持SQL,当然也不会和任何SQL及存储过程兼容。
目前还没有。
SQL语句的信息不足, 需要猜出其目标才能设计合理的优化路径。我们优化SQL的经验远不如传统数据库厂商,这时候直接把SQL转换成SPL通常会导致更差的性能。
SPL专门用于低代码和高性能
SPL语法很容易,有Java/SQL基础者只要数小时即可入门,数周就能熟练
“难”,高性能算法有点难, 需要学习更多算法知识
“不难”,一旦学会,很多高性能任务都成为“套路”
最初的1-2个场景,由我方工程师介入配合用户实现
大多数程序员习惯了SQL思维方式,不熟悉SPL的思维方式,需要用一两个场景训练和理解
性能优化套路经历过也就学会了,算法设计和实现并不是那么难
授人以鱼不如授人以渔!
大数据处理速度比传统方案平均提高1个数量级
语法过程化,符合自然思维
丰富类库
多源混合计算
独立、嵌入多种应用方式
单机顶集群,减少硬件开销
绿色环保
开发、硬件、运维成本降低X倍