esProc SPL 相当于有了 Python 加持的 DuckDB

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 这篇文章介绍了如何在SQL和SPL中对分组内的记录进行计算,并将结果填充到每组的第一条记录中。SQL需要使用复杂的窗口函数、多次计算且代码冗长,而SPL可以直接引用分组数据,利用自然序号简洁实现。文章通过具体案例对比两者的代码实现,展示SPL在处理此类问题上的简洁性和高效性。

对于桌面数据分析用户,如果说 DuckDB 是轻巧灵活的 "SQL 瑞士军刀",那 esProc SPL 简直就是自带 Python 技能的 "全能工具箱",既保留 SQL 的便捷,又突破 SQL 的天花板。

和 DuckDB 一样,esProc SPL 对文件处理的支持相当到位。CSV、Excel 这类常见格式直接当数据库用,直接就能跑 SQL。比如查个销售数据:

$SELECT region, SUM(amount) FROM sales.csv GROUP BY region

这种轻量级操作手到擒来。和 DuckDB 类似,esProc 也支持数据的二进制化,不过是存成文件的,压缩比很好,加载百万行数据秒开,比直接读 CSV 快三倍不止。

esProc 的 SQL 目前不支持窗口函数,不如 DuckDB 完善。不过 esProc 有个杀手锏是它的原生语言 SPL,处理复杂任务要比 SQL 简单很多,其实也用不着再写挠头的窗口函数了。
比如给各省销售额 Top3 的销售员发奖金的计算。用 SQL 得写多层嵌套:

WITH ranked_sales AS (
  SELECT province, salesman, amount,
    ROW_NUMBER() OVER(PARTITION BY province ORDER BY amount DESC) as rank
  FROM sales
)
SELECT * FROM ranked_sales WHERE rank <=3

换 SPL 就直白得多:

sales.groups(province;top(-3;amount))

这种任务用 SQL 还能写出来,如果再难一点,比如要算“客户连续购买天数超过 5 天时,自动触发积分翻倍奖励”,恐怕就干瞪眼了。涉及流程控制,想在 SQL 里搞个循环,根据条件动态调整计算逻辑,对不起,SQL 的 IF 和 LOOP 弱得跟摆设一样,绕来绕去费劲写出来的代码 3 天以后自己都看不懂。所以 Duckdb 经常要依靠 Python。

DuckDB 的 Python 接口做得非常流畅,但组合使用时还是会有分裂感:SQL 查完数据读出到 DataFrame,完事儿可能又得写回数据库。两套体系,编写和调试都不一样,不仅思维需要切换,左右横跳也难受。就像在川菜馆点牛排,不是不行,就是别扭。
而 esProc SPL 则直接把 Python 的核心能力内置了。
上面”连买 5 天”的计算用 SPL 写:

A
1 $SELECT * FROM orders.csv ODDER BY client,order_date
2 =A1.group(client).conj(~.run(streak = if(order_date[-1] && order_date==order_date[-1]+1, streak+1, 1)).select(streak>=5))
3 =A2.groups(client;"Doubling":bonus)

这代码其实比 Python 还要更简洁。

有完善计算能力、支持过程计算、提供流程控制机制,esProc SPL 的能力超越了加装 Python 的 DuckDB。既有 SQL 的轻快,又有编程语言的灵活,还不用在多个工具间来回折腾。对于经常要处理复杂计算的桌面分析师来说,这可能是比 "SQL+Python" 组合更优雅的解法。毕竟,谁不想在一个窗口里就搞定所有累活呢?

相关文章
|
C++ Python
esproc vs python 2 简单计算
1.添加Age、Fullname字段esproc:A4:我们用T表示序表。T.derive()表示增加字段。这里用age(日期)计算出年龄,作为Age字段。用NAME,SURNAME得到Fullname。
1195 0
|
C++ Python
esproc vs python 1 增删改查
增加记录:在第二的位置增加一条记录esproc A4:添加一条记录(“:”前表示字段值,“:”后表示字段),其中2表示第二条记录的位置 A5:计算运算时间(interval():计算时间间隔。@ms表示以毫秒为单位) python: import time import pandas as pd...
1407 0
|
5月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
430 102
|
5月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
391 104
|
5月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
301 103
|
5月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
227 82
|
4月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
343 3
|
4月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
570 3
|
4月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
373 3
|
4月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
438 0

推荐镜像

更多