查询 csv/xls 等文件--SPL 轻量级多源混算实践 2

简介: SPL 支持多种文件格式处理,无论是 CSV 还是 Excel,均可通过简单语法完成数据读取与复杂计算。对于有标题或无标题文件,SPL 提供灵活字段引用方式,支持过滤、分组、汇总等操作。同时,SPL 兼容 SQL92 语法,允许用户使用 SQL 查询文件数据,适合熟悉 SQL 的用户。复杂计算可结合 SPL 原生语法与 SQL 混合使用,实现高效数据分析。

用 SPL 查文件也很简单,而且能处理各种文件格式。

计算用例
查询目标

基于 orders1.csv(有标题),统计 2024 年各类订单状态的订单金额

SPL 语法
编写脚本
image.png
A1:读入 CSV,T() 函数会根据文件扩展名读出文件内容,返回成序表全部加载到内存

A2:过滤 2024 年数据

A3:按订单状态分组汇总

有时 csv 可能没有标题行,这时该怎么处理呢?

比如要基于没标题的 orders2.csv 完成前面的计算。
image.png
A1:加了 @b 选项代表处理无标题文件,读出后字段名会用 _1 _2 _3…来表示

A2:就用 _3(第三列)来过滤 2024 年数据。

后面的计算是类似的。

除了这种方式,SPL 还允许使用列号来读取该列数据:
image.png
这里不再用列名而是通过 #列号 的方式来计算。

SQL 语法
SPL 的原生语法可以完成各类计算,但有时对于熟悉 SQL 的人如果能用 SQL 查文件就好了。SPL 考虑到了这点,也提供了 SQL 语法。

比如前面的计算,也能直接用 SQL 搞定。

有标题时:

$select order_status,sum(total_amount) tamt from orders1.csv where year(order_date)=2024 group by order_status

直接基于 CSV 执行 SQL,不仅仅是 CSV,XLS\MongoDB\Restful\Json 各类数据源都可以。

处理无标题 CSV 时要复杂一些,需要借助 SPL 语法读入数据再用 SQL 查询:

$select _10 order_status,sum(_8) tamt from  {
   T@b("orders2.csv")} where year(_3)=2024 group by _10

这里{T@b(“orders2.csv”)} 用大括号包上的内容就是 SPL 语法,因为返回的字段名都是 _1 _2 形式,SQL 使用的字段名也都是这种。

目前 SPL 提供的 SQL 语法支持到 SQL92 程度,连 WITH 也可以使用,但是并不支持窗口函数,因为使用 SPL 原生语法可以处理各种复杂计算,所以支持到这种程度就够了。

下面是一些 SQL 查询示例。

日期计算:

$select * from d:/Orders.csv where (OrderDate<date('2020-01-01') and Amount<=100) or (OrderDate>=date('2020-12-31') and Amount>100)

Case when:

$select case year(OrderDate) when 2010 then 'this year' when 2010 then 'last year' else 'previous years' end from d:/Orders.csv

Group by …having:

$select Client,year(OrderDate) y,sum(Amount) amt from d:/Orders.csv 
group by Client,year(OrderDate) having sum(Amount)>1000

JOIN:

$select o.OrderId,o.Client,e.Name e.Dept,e.EId from d:/Orders.csv o 
left join d:/Emp.csv e on o.SellerId=e.Eid

Excel 处理
处理 Excel 也类似,比如根据 orders.xls,分别读取第二个 sheet(有标题)和第三个 sheet(无标题),查询订单金额超过 500 的大客户。

我们把代码写在一起:
image.png
对于熟悉 SQL 的选手,相对简单的情况用 SQL 查,复杂情况用 SPL 原生语法来处理,而且二者可以混合使用,基本就无敌了。

相关文章
|
人工智能 JavaScript Linux
Nuxt.js在centos7上的发布部署
Nuxt.js在centos7上的发布部署
285 0
Nuxt.js在centos7上的发布部署
|
前端开发 Java 应用服务中间件
nginx结合前后端分离项目springboot+vue的配置
nginx结合前后端分离项目springboot+vue的配置
472 0
|
5月前
|
人工智能 监控 安全
开源AI守护后厨——餐饮厨房视频安全系统的技术解析
餐饮厨房视频安全系统是一套融合开源AI技术与视频监控的智能化解决方案,涵盖实时检测、行为监测、数据分析、公众透明化及反馈闭环五大模块。系统通过YOLOv8、ResNet等算法实现后厨卫生与操作规范的精准监控,识别率达97%,问题响应时间缩短至秒级。同时支持后厨直播与监管对接,提升消费者信任和管理效率。其灵活开源的特点,为食品行业安全管理提供了高效、透明的新路径,未来可扩展至食品加工等领域。
391 0
|
网络协议 Ubuntu Linux
在Linux中,如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0。
在Linux中,如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0。
|
JavaScript 前端开发 Java
面试官:假如有几十个请求,如何去控制并发?
面试官:假如有几十个请求,如何去控制并发?
|
消息中间件 容灾 物联网
【RocketMQ系列十四】RocketMQ中消息堆积如何处理
【RocketMQ系列十四】RocketMQ中消息堆积如何处理
2419 3
scrollIntoView()定位元素显示导致页面上移解决方法?
scrollIntoView()定位元素显示导致页面上移解决方法?
994 0
|
监控 负载均衡 算法
Golang深入浅出之-Go语言中的协程池设计与实现
【5月更文挑战第3天】本文探讨了Go语言中的协程池设计,用于管理goroutine并优化并发性能。协程池通过限制同时运行的goroutine数量防止资源耗尽,包括任务队列和工作协程两部分。基本实现思路涉及使用channel作为任务队列,固定数量的工作协程处理任务。文章还列举了一个简单的协程池实现示例,并讨论了常见问题如任务队列溢出、协程泄露和任务调度不均,提出了解决方案。通过合理设置缓冲区大小、确保资源释放、优化任务调度以及监控与调试,可以避免这些问题,提升系统性能和稳定性。
529 6
|
JavaScript 前端开发 IDE
程序员必知:WPSJSA宏编程(JS):1.初识
程序员必知:WPSJSA宏编程(JS):1.初识
1261 0
|
Java API
List转Map(id为key,list为value)
List转Map(id为key,list为value)
677 0