用 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.pswp.cn/bicheng/79961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79961.shtml
英文地址,請注明出處:http://en.pswp.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…