多样性数据源混合计算是常态需求,同构或异构数据库之间、文件与数据库、NoSQL与文件等,理论上任何数据存储之间都涉及数据混合计算和分析。但混算需求目前技术解决的并不好,同构库之间某些数据库还能支持,而完全异构的数据源实施混算就比较麻烦。经常要借助逻辑数据仓库,但基于SQL的逻辑数仓不仅能力有限,而且体系过于沉重,经常会比应用本身还复杂,只适合应用于大型场景中,并不适合众多日常的轻量多源混算场景。
SPL因为具备丰富的多样性数据源支持,所有数据源接入后都会转换成统一数据对象(序表或游标),这就具备了天然混合计算的基础,不管何种数据源只要能访问到就能混合计算。SPL很轻,可以嵌入到应用中使用,让应用本身就能具备多源混算能力。而且,SPL语法的简洁度甚至超过SQL,所以用SPL做多源混算不仅功能满足,在工程实现上也更加方便。
SPL为多源计算设计了两种Connector,最常见的RDB,文本、Excel、JSON等本地文件,以及HTTP数据源等都属于原生Connector内置在SPL核心体系中;其他多样性数据源,如MongoDB、Kafka、ElasticSearch、云存储属于外部Connector,不在SPL核心体系内,以“外部库”的形式提供,随需引入即可。
对于最常见的RDB,SPL通过JDBC与数据库交互,能动态生成/拼接SQL,也可以为SQL传递参数,原来在Java等语言与SQL结合的场景都可以使用SPL来完成。
一句执行SQL并传递参数:
A | |
1 | =db.query@x("select order_status,sum(total_amount) tamt,count(1) cnt from orders where year(order_date)=? group by order_status",d_year) |
处理CSV文件也简单,3句就能完成从读取到过滤再到汇总的计算:
A | |
1 | =T("orders1.csv") |
2 | =A1.select(year(order_date)==2024) |
3 | =A2.groups(order_status;sum(total_amount)) |
而且SPL还为熟悉SQL的小伙伴提供了SQL支持,可以用SQL查文件:
$select order_status,sum(total_amount) tamt from orders1.csv
where year(order_date)=2024 group by order_status
SPL语法和SQL语法还能混用,可以应付任意复杂情况。比如查询无标题CSV时,用SPL语法读取,然后用SQL做计算:
$select _10 order_status,sum(_8) tamt from
{T@b("orders2.csv")} where year(_3)=2024 group by _10
除了数据库表、CSV、Excel这些二维结构,SPL还特别擅长处理诸如JSON类的多层数据。SPL提供了读取Restful和JSON文件的接口,数据读入后可以通过点(.)操作符逐级引用多层数据,代码简单直观:
A | |
1 | =json(httpfile("http://192.168.2.52:8503/orders").read()) |
2 | =A1.select(order_details.select@1(product.category==categ) && order_details.sum(price*quantity)>200) |
对于一些没那么常用的数据源,像MongoDB、Kafka、ES这些,SPL基于数据源的原生接口进行了简单封装,用到哪个引入哪个就可以。而且这种轻封装(相对逻辑数仓要深度定制开发)的模式更易于扩展,还能保留数据源的原生语法充分发挥数据源自身的能力。
以MongoDB为例,SPL连接、读取、和MySQL混算也是一气呵成:
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) |
SPL不仅能处理小数据,当数据大到内存装不下时,就要用到SPL提供的游标机制,分批加载到内存处理数据。这样无论何种规模的数据计算,SPL都能轻松搞定。
比如在多库数据合并和关联计算时,用SPL实施大数据计算仍然很简单:
多库数据合并/比对:
A | |
1 | =connect("dba") |
2 | =A1.cursor@x("select * from orders order by order_id") |
3 | =connect("dbb") |
4 | =A3.cursor@x("select * from orders order by order_id") |
5 | =[A2,A4].merge@u(order_id) |
6 | =A5.groups(product_id;sum(total_amount):tamt) |
跨库关联:
A | |
1 | =connect("vehicle") |
2 | =A1.cursor@x("select * from vehicle_master order by plate_no") |
3 | =connect("traffic") |
4 | =A3.cursor@x("select * from traffic_violation order by plate_no") |
5 | =joinx(A2:v,plate_no;A4:t,plate_no) |
6 | =A5.groups(year(t.violate_time),v.brand;count(1):cnt) |
游标与内存序表的操作基本一致。
此外,SPL还为不同数据库之间移植SQL提供了无缝迁移能力。简单配置和编码就能透明不同数据库之间的方言差异,获得“更换数据库也不用改SQL”的爽感。
我们已经将SPL做多源混合计算的各种情况做成了免费课程:
通过本课程,您将快速掌握多源数据融合计算能力,轻松实现跨库/文件/API/NoSQL的混合计算,完成从轻量级方案设计到SQL无缝迁移的全流程实战,用简洁架构替代复杂系统。