SPL 处理多层 JSON 数据比 DuckDB 方便多了

简介: esProc SPL 处理多层 JSON 数据比 DuckDB 更便捷,尤其在保留 JSON 层次与复杂计算时优势明显。DuckDB 虽能通过 `read_json_auto()` 将 JSON 解析为表格结构,但面对深层次或复杂运算时,SQL 需频繁使用 UNNEST、子查询等结构,逻辑易变得繁琐。而 SPL 以集合运算方式直接处理子表,代码更简洁直观,无需复杂关联或 Lambda 语法,同时保持 JSON 原始结构。esProc SPL 开源免费,适合复杂 JSON 场景,欢迎至乾学院探索!

esProc SPL 处理多层 JSON 数据要比 DuckDB 方便很多,尤其需要保留 JSON 层次以及进行复杂计算时。

DuckDB 的 JSON 处理能力还是不错的,read_json_auto() 能直接把 JSON 解析成表格结构,直接对着多层数据操作就行:

SELECT order_id, order_date, json_extract(customer, '$.name') AS cusName,json_extract(customer, '$.city') AS cusCity FROM read_json_auto('orders.json')

SPL 做这种基本运算会更简单:

json(file("orders.json").read()).new(order_id, order_date,customer.name:cusname,customer.city:cuscity)

直接用点(.)取子层级数据,很直观。

稍复杂的运算,比如要计算某个订单数据里的 Electronics 分类的销售金额。用 DuckDB 需要展开 order_details,再筛选 category=‘Electronics’,然后求个 SUM(price * quantity)。

SELECT sum(od.quantity*od.price) amount
FROM read_json_auto('orders.json') AS o,
LATERAL UNNEST(o.order_details) AS t(od),
LATERAL UNNEST([od.product]) AS t(p)
WHERE p.category = 'Electronics'

为了完成这样的计算,SQL 要把子表和主表关联起来做内接连来实现过滤,已经有点绕了,但还是不算非常复杂。

SPL 则可以直接将子表当集合运算:

json(file("order3.json").read()).conj(order_details).select(product.category=="Electronics").sum(quantity*price)

一句写完, 不需要做关联,逻辑简单,比 DuckDB 的优势就更明显了。

情况再复杂点,比如要先筛选 Electronics 类的订单明细,再剔除订单金额低于 200 的订单,DuckDB 的 SQL 就开始变得难写了。展开 order_details 之后要再聚合计算订单金额,然后再基于这个结果筛选符合条件的订单,再做嵌套查询或者用 CTE 才能保持数据结构的完整性,SQL 一长,调试起来就不太友好了。用 lambda 语法能简单一些,但和传统 SQL 形式大相径庭了。

SELECT
    o.order_id, 
    LIST_FILTER(o.order_details, x -> x.product.category = 'Electronics') AS order_details
FROM read_json_auto(orders.json') AS o
WHERE 
    ARRAY_LENGTH(LIST_FILTER(o.order_details, x -> x.product.category = 'Electronics')) > 0
    AND SUM(
        LIST_FILTER(o.order_details, x -> x.product.category = 'Electronics') -> 
            (x -> x.price * x.quantity)
    ) > 200;

SPL 代码依然很自然:

=A2.select(order_details.select@1(product.category=="Electronics") && order_details.sum(price*quantity)>200)

还是一句,将子表作为集合处理就行了。不涉及烧脑的子查询和 Lambda 语法,不管多少层直接引用,过滤、聚合直接整就完了。而且 SPL 还能保持 JSON 的多层结构,不需要折腾 GROUP BY 和 LATERAL UNNEST 之类的复杂 SQL。

DuckDB 确实对 JSON 处理得不错,但写起来还是要倒腾 UNNEST 之类的 SQL 结构,层次一多就显得麻烦。而 SPL 直接按 JSON 的多层结构处理,既能方便筛选、聚合,又能保持数据的原始层次,显然更适合应对复杂 JSON 计算场景。

esProc SPL是开源免费的,欢迎前往乾学院了解更多!

相关文章
|
26天前
|
JSON API 数据格式
淘宝商品评论API接口,json数据示例参考
淘宝开放平台提供了多种API接口来获取商品评论数据,其中taobao.item.reviews.get是一个常用的接口,用于获取指定商品的评论信息。以下是关于该接口的详细介绍和使用方法:
|
28天前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
125 67
|
3天前
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
29 3
|
4月前
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
4月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult<T>`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码"0"和消息"操作成功!",有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
247 0
|
4月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 "",Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
128 0
|
4月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
355 0
|
1月前
|
JSON 前端开发 应用服务中间件
配置Nginx根据IP地址进行流量限制以及返回JSON格式数据的方案
最后,记得在任何生产环境部署之前,进行透彻测试以确保一切运转如预期。遵循这些战术,守卫你的网络城堡不再是难题。
75 3
|
3月前
|
XML JSON API
如何在 Postman 中上传文件和 JSON 数据
如果你想在 Postman 中同时上传文件和 JSON 数据,本文将带你一步一步地了解整个过程,包括最佳实践和技巧,让你的工作更轻松。
|
3月前
|
JSON JavaScript 前端开发
如何在 Postman 中发送 JSON 数据
我们将深入探讨使用 Postman 发送 JSON 数据这一主题,Postman 是一款强大的 API 测试和开发工具。无论您是经验丰富的开发人员还是新手,掌握这项技能对于高效的 API 测试和开发都至关重要。