用 DuckDB 高效分析 JSON 数据:从入门到实战

解析 JSON 文件进行分析常常充满挑战。无论你是在处理 API 响应、日志文件,还是应用数据,如果没有合适的工具,分析 JSON 都会非常耗时。

借助 DuckDB,你可以直接用 SQL 查询复杂的 JSON 文件,无需编写复杂的解析代码或搭建重量级数据库环境,就能高效分析 JSON 数据。

Analyzing JSON Data with DuckDB and SQL

本文将带你了解如何使用 DuckDB 高效地查询和分析 JSON 数据,内容涵盖:

  • 在你的系统上安装和配置 DuckDB

  • 加载并查询 JSON 数据

  • 处理嵌套的 JSON 结构

  • 操作 JSON 数组和复杂对象

我们将基于真实的电商数据进行演示,介绍可立即应用于实际项目的技巧。让我们开始吧!

🔗 [GitHub 上的代码链接]


安装与启动 DuckDB

DuckDB 轻量且易于安装。下面是安装与运行 DuckDB 的步骤:

如果你使用的是 Linux 发行版,并希望通过命令行使用 duckdb,请执行以下操作:

安装 DuckDB:

$ curl https://install.duckdb.org | sh

添加到 PATH:

$ export PATH='/home/user/.duckdb/cli/latest':$PATH

通过命令行启动 DuckDB:

$ duckdb

你将看到如下界面:

v1.2.2 7c039464e4
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D

现在你已经准备就绪!

🔗 你可以查看 DuckDB 的安装文档,了解其他平台的安装指南。


使用示例 JSON 数据

我们将创建一个实用的电商数据集进行演示。该 JSON 结构包含订单、客户信息和产品明细,类似于真实电商 API 返回的数据。

📁 示例 JSON 数据存放于 ecommerce_data.json 文件中。


加载与查询 JSON 数据

现在,让我们把 JSON 数据加载到 DuckDB,并执行一些基础查询。

加载 JSON 数据

连接到 DuckDB 后,运行以下命令:

-- 从 JSON 文件创建表
CREATE TABLE ecommerce AS 
SELECT * FROM read_json_auto('ecommerce_data.json');

此命令会读取 JSON 文件并自动推断数据表结构。read_json_auto 函数还能识别嵌套结构和数组。

确认数据是否正确加载:

-- 查看数据
SELECT * FROM ecommerce;

你应该会看到整个 JSON 数据以结构化表格的形式展现:

┌──────────┬───┬──────────────────────┬──────────────────────┐
│ order_id │ … │        items         │       payment        │
│ varchar  │   │ struct(product_id …  │ struct("method" va…  │
├──────────┼───┼──────────────────────┼──────────────────────┤
│ ORD-1001 │ … │ [{'product_id': PR…  │ {'method': credit_…  │
│ ORD-1002 │ … │ [{'product_id': PR…  │ {'method': paypal,…  │
├──────────┴───┴──────────────────────┴──────────────────────┤
│ 2 rows                                 5 columns (3 shown) │
└────────────────────────────────────────────────────────────┘

基础查询示例

先来几个简单查询:

-- 统计订单数量
SELECT COUNT(*) AS order_count FROM ecommerce;

输出:

┌─────────────┐
│ order_count │
│    int64    │
├─────────────┤
│      2      │
└─────────────┘

提取嵌套字段时,->>'name' 用于从 customer 对象中提取 name 字段文本,->> 返回文本,-> 返回 JSON。

-- 获取订单号及客户姓名
SELECT order_id,customer->>'name' AS customer_name
FROM ecommerce;

输出:

┌──────────┬───────────────┐
│ order_id │ customer_name │
│ varchar  │    varchar    │
├──────────┼───────────────┤
│ ORD-1001 │ Alex Johnson  │
│ ORD-1002 │ Sarah Miller  │
└──────────┴───────────────┘

操作嵌套 JSON 结构

JSON 的一个难点在于处理嵌套对象。比如提取客户地址信息:

-- 提取客户地址信息
SELECT order_id,customer->>'name' AS customer_name,customer->'address'->>'city' AS city,customer->'address'->>'state' AS state
FROM ecommerce;

输出:

┌──────────┬───────────────┬─────────┬─────────┐
│ order_id │ customer_name │  city   │  state  │
│ varchar  │    varchar    │ varchar │ varchar │
├──────────┼───────────────┼─────────┼─────────┤
│ ORD-1001 │ Alex Johnson  │ Boston  │ MA      │
│ ORD-1002 │ Sarah Miller  │ Seattle │ WA      │
└──────────┴───────────────┴─────────┴─────────┘

你可以通过链式箭头操作符深入 JSON 结构。

还可以基于嵌套字段进行筛选:

-- 查找来自西雅图的订单
SELECT order_id,customer->>'name' AS customer_name
FROM ecommerce
WHERE customer->'address'->>'city' = 'Seattle';

输出:

┌──────────┬───────────────┐
│ order_id │ customer_name │
│ varchar  │    varchar    │
├──────────┼───────────────┤
│ ORD-1002 │ Sarah Miller  │
└──────────┴───────────────┘

提取支付信息:

-- 获取支付详情
SELECT order_id,payment->>'method' AS payment_method,CAST(payment->>'total' AS DECIMAL) AS total_amount
FROM ecommerce;

输出:

┌──────────┬────────────────┬───────────────┐
│ order_id │ payment_method │ total_amount  │
│ varchar  │    varchar     │ decimal(18,3) │
├──────────┼────────────────┼───────────────┤
│ ORD-1001 │ credit_card    │       179.970 │
│ ORD-1002 │ paypal         │       137.960 │
└──────────┴────────────────┴───────────────┘

注意,这里通过 CAST 将 total 转为 decimal,便于数值运算。


处理数组与复杂对象

JSON 数组需要特殊处理。来看如何展开每笔订单中的 items:

-- 将 items 数组展开为多行
SELECT order_id,customer->>'name' AS customer_name,unnest(items) AS item
FROM ecommerce;

输出:

┌──────────┬───────────────┬───────────────────────────────────────────────────┐
│ order_id │ customer_name │                       item                        │
│ varchar  │    varchar    │ struct(product_id varchar, "name" varchar, cate…  │
├──────────┼───────────────┼───────────────────────────────────────────────────┤
│ ORD-1001 │ Alex Johnson  │ {'product_id': PROD-501, 'name': Wireless Headp…  │
│ ORD-1001 │ Alex Johnson  │ {'product_id': PROD-245, 'name': Smartphone Cas…  │
│ ORD-1002 │ Sarah Miller  │ {'product_id': PROD-103, 'name': Coffee Maker, …  │
│ ORD-1002 │ Sarah Miller  │ {'product_id': PROD-107, 'name': Coffee Beans P…  │
└──────────┴───────────────┴───────────────────────────────────────────────────┘

unnest() 函数将 JSON 数组的每个元素转换为一行,便于 SQL 分析。

进一步提取每个 item 的字段:

-- 提取每个商品明细
SELECT order_id,customer->>'name' AS customer_name,item->>'name' AS product_name,item->>'category' AS category,CAST(item->>'price' AS DECIMAL) AS price,CAST(item->>'quantity' AS INTEGER) AS quantity
FROM (SELECT order_id,customer,unnest(items) AS itemFROM ecommerce
) AS unnested_items;

输出:

┌──────────┬───────────────┬───┬───────────────┬──────────┐
│ order_id │ customer_name │ … │     price     │ quantity │
│ varchar  │    varchar    │   │ decimal(18,3) │  int32   │
├──────────┼───────────────┼───┼───────────────┼──────────┤
│ ORD-1001 │ Alex Johnson  │ … │       129.990 │        1 │
│ ORD-1001 │ Alex Johnson  │ … │        24.990 │        2 │
│ ORD-1002 │ Sarah Miller  │ … │        89.990 │        1 │
│ ORD-1002 │ Sarah Miller  │ … │        15.990 │        3 │
├──────────┴───────────────┴───┴───────────────┴──────────┤
│ 4 rows                              6 columns (4 shown) │
└─────────────────────────────────────────────────────────┘

这里通过子查询展开 items 再提取字段,是处理嵌套数组的关键。

做一些数据分析:

-- 计算每个订单的总价值与商品数量
SELECT order_id,customer->>'name' AS customer_name,CAST(payment->>'total' AS DECIMAL) AS order_total,json_array_length(items) AS item_count
FROM ecommerce;

输出:

┌──────────┬───────────────┬───────────────┬────────────┐
│ order_id │ customer_name │  order_total  │ item_count │
│ varchar  │    varchar    │ decimal(18,3) │   uint64   │
├──────────┼───────────────┼───────────────┼────────────┤
│ ORD-1001 │ Alex Johnson  │       179.970 │          2 │
│ ORD-1002 │ Sarah Miller  │       137.960 │          2 │
└──────────┴───────────────┴───────────────┴────────────┘

json_array_length() 可用于获取每个订单的商品数量。

-- 按商品类别统计平均单价
SELECT item->>'category' AS category,AVG(CAST(item->>'price' AS DECIMAL)) AS avg_price
FROM (SELECT unnest(items) AS itemFROM ecommerce
) AS unnested_items
GROUP BY category
ORDER BY avg_price DESC;

输出:

┌─────────────────┬───────────┐
│    category     │ avg_price │
│     varchar     │  double   │
├─────────────────┼───────────┤
│ Electronics     │    129.99 │
│ Kitchen         │     89.99 │
│ Accessories     │     24.99 │
│ Food & Beverage │     15.99 │
└─────────────────┴───────────┘

该查询先展开 items,再按类别分组计算平均价格。


总结

你已掌握使用 DuckDB 分析 JSON 数据的核心技巧。这些方法能帮你轻松应对大多数 JSON 数据分析需求。DuckDB 结合了熟悉的 SQL 语法和强大的 JSON 专用函数,让你高效处理复杂数据。

下次遇到庞杂的 JSON 数据集时,希望你能跳过繁琐的解析步骤,直奔高效分析!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从贴牌到品牌:出海官网如何让中国制造“贵”起来?

在全球经济一体化的当下,中美关税战如同一记重锤,给国际贸易格局带来了巨大震荡。自贸易摩擦爆发以来,双方多次调整关税政策,涉及的商品种类不断增多,税率持续攀升,众多中国企业的出口业务遭受重创&#xf…

react-13react中外部css引入以及style内联样式(动态className与动态style)

1. 外部css文件 - 普通引入 1.1 创建一个 CSS 文件,MyComponent.css。 /* MyComponent.css */ .my-class {color: red;font-size: 20px; } 1.2 组件中import引入 import React from react; import ./MyComponent.css; // 引入 CSS 文件function MyComponent() {r…

n8n 与智能体构建:开发自动化 AI 作业的基础平台

n8n 是一款开源的自动化流程构建平台,通过其模块化节点系统,开发者可以快速实现跨平台的任务编排、数据集成与智能交互。当 n8n 与大型语言模型(LLM)结合时,就能构建出具备感知、推理、执行能力的 AI 智能体&#xff0…

14.Spring Boot 3.1.5 集成 Spring Security 进行访问控制

14.Spring Boot 3.1.5 集成 Spring Security 进行访问控制 Spring Security 是一个强大且高度可定制的认证和访问控制框架,专为基于 Spring 的应用程序设计。它为基于 Java EE 的企业应用程序提供了全面的安全解决方案,包括 Web 应用程序安全和方法级安…

Linux学习笔记(二):Linux权限管理

文章目录 一、Linux下用户的分类1. Linux下用户分为两类:2. 这两类用户如何进行切换呢?3. 短暂提权 二、何为权限1. 什么是权限2. Linux的文件后缀意义 三、修改权限1. 设置文件的访问权限——chmod2. 修改文件拥有者——chown3. 修改文件所属组——chgr…

学习alpha,第2个alpha

alphas (-1 * ts_corr(rank(ts_delta(log(volume), 2)), rank(((close - open) / open)), 6)) 先分析操作符从左到右 ts_corr: Pearson 相关度量两个变量之间的线性关系。当变量呈正态分布且关系呈线性时,它最有效。 ts_corr(vwap, close, 20)是一个计算时间序列相…

Paddle Serving|部署一个自己的OCR识别服务器

前言 之前使用C部署了自己的OCR识别服务器,Socket网络传输部分是自己写的,回过头来一看,自己犯傻了,PaddleOCR本来就有自己的OCR服务器项目,叫PaddleServing,这里记录一下部署过程。 1 下载依赖环境 1.1 …

React Native【详解】搭建开发环境,创建项目,启动项目

下载安装 node https://nodejs.cn/download/ 查看 npx 版本 npx -v若无 npx 则安装 npm install -g npx创建项目 npx create-expo-applatestRN_demo 为自定义的项目名称 下载安装 Python 2.7 下载安装 JAVA JDK https://www.oracle.com/java/technologies/downloads/#jdk24-…

NVIDIA Halos:智能汽车革命中的全栈式安全系统

高级辅助驾驶行业正面临一个尴尬的"安全悖论"——传感器数量翻倍的同时,事故率曲线却迟迟不见明显下降。究其原因,当前行业普遍存在三大技术困局: 碎片化安全方案 传统方案就像"打补丁",激光雷达厂商只管点云…

数据资产管理与AI融合:物联网时代的新征程

一、引言 在当今数字化浪潮席卷全球的时代,数据资产已成为企业和组织的核心竞争力之一。随着物联网(IoT)技术的飞速发展,海量的数据如潮水般涌来,如何高效地管理和利用这些数据资产成为了亟待解决的问题。与此同时&am…

MySQL 表的内外连接

文章目录 表的内外连接(重点)内连接外连接左外连接右外连接 表的内外连接(重点) 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使…

VTK 交互类介绍

基本概念 交互器(Interactor): 处理用户输入事件的基础类 交互样式(InteractorStyle): 定义具体的交互行为 Widgets: 可交互的UI组件,如滑块、按钮等 Picker: 用于选择场景中的对象 常用交互类 类名功能描述vtkRenderWindowInteractor渲染窗口交互器vtkInteractorStyle交互样式…

C语言动态库与静态库编译测试示例详细介绍终结篇

C语言动态库与静态库编译链接时的详细对比与示例 下面我将提供更详细的示例,并通过对比表格清晰地展示静态库和动态库的特性差异以及它们之间的各种链接关系。 ## 1. 静态库与动态库特性对比 | 特性 | 静态库(.a/.lib) | 动态…

神经网络:节点、隐藏层与非线性学习

神经网络:节点、隐藏层与非线性学习 摘要: 神经网络是机器学习领域中一种强大的工具,能够通过复杂的结构学习数据中的非线性关系。本文从基础的线性模型出发,逐步深入探讨神经网络中节点和隐藏层的作用,以及它们如何…

POI创建Excel文件

文章目录 1、背景2、创建表格2.1 定义表头对象2.2 Excel生成器2.3 创建模板2.4 处理Excel表头2.5 处理Excel内容单元格样式2.6 处理单个表头 3、追加sheet4、静态工具5、单元测试6、完整代码示例 1、背景 需求中有需要用户自定义Excel表格表头,然后生成Excel文件&a…

【分布式系统中的“瑞士军刀”_ Zookeeper】三、Zookeeper 在实际项目中的应用场景与案例分析

在分布式系统日益复杂的当下,Zookeeper 凭借强大的协调能力成为众多项目的关键组件。本篇文章将结合实际项目场景,详细介绍 Zookeeper 在电商秒杀、微服务架构、分布式配置管理以及大数据处理集群等领域的应用,以及在不同的案例场景下的具体分…

【翻译、转载】MCP 提示 (Prompts)

原文地址:https://modelcontextprotocol.io/docs/concepts/prompts#python 提示 (Prompts) 创建可重用的提示模板和工作流 提示 (Prompts) 使服务器能够定义可重用的提示模板和工作流,客户端可以轻松地将其呈现给用户和 LLM。它们提供了一种强大的方式来…

accept() reject() hide()

1. accept() 用途 确认操作:表示用户完成了对话框的交互并确认了操作(如点击“确定”按钮)。 关闭模态对话框:结束 exec() 的事件循环,返回 QDialog::Accepted 结果码。适用场景 模态对话框(通过 exec()…

如何查看电脑IP地址和归属地:全面指南

在数字化时代,了解自己电脑的IP地址和归属地信息变得越来越重要。无论是进行网络故障排查、远程办公设置,还是出于网络安全考虑,掌握这些基本信息都很有必要。本文将详细介绍如何查看电脑的公网IP、内网IP以及归属地信息,并提供常…

基于python生成taskc语言文件--时间片轮询

目录 前言 utf-8 chinese GB2312 utf-8 排除task.c chinese GB2312 排除task.c 运行结果 前言 建议是把能正常工作的单个功能函数放到一起(就和放while函数里的程序一样),程序会按顺序自动配置。 不同的格式已经对应给出。 utf-8 impo…