SPL轻量级多源混合计算

多样性数据源混合计算是常态需求,同构或异构数据库之间、文件与数据库、NoSQL与文件等,理论上任何数据存储之间都涉及数据混合计算和分析。但混算需求目前技术解决的并不好,同构库之间某些数据库还能支持,而完全异构的数据源实施混算就比较麻烦。经常要借助逻辑数据仓库,但基于SQL的逻辑数仓不仅能力有限,而且体系过于沉重,经常会比应用本身还复杂,只适合应用于大型场景中,并不适合众多日常的轻量多源混算场景。

SPL因为具备丰富的多样性数据源支持,所有数据源接入后都会转换成统一数据对象(序表或游标),这就具备了天然混合计算的基础,不管何种数据源只要能访问到就能混合计算。SPL很轻,可以嵌入到应用中使用,让应用本身就能具备多源混算能力。而且,SPL语法的简洁度甚至超过SQL,所以用SPL做多源混算不仅功能满足,在工程实现上也更加方便。

图形用户界面

AI 生成的内容可能不正确。

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无缝迁移的全流程实战,用简洁架构替代复杂系统。

      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值