DuckDB系列教程:如何分析Parquet文件

Parquet 是一種強大的、基于列的存儲格式,適用于實現更快捷和更高效的數據分析。您可以使用 DuckDB 這種內存型分析數據庫來處理 Parquet 文件并運行查詢以對其進行分析。···
在這篇文章中,我們將逐步介紹如何使用 DuckDB 對存儲在 Parquet 文件中的餐廳訂單數據集進行分析。

安裝 DuckDB 并開始使用

首先,如果您尚未安裝 DuckDB,請執行以下操作:

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

現在,在您的終端中打開并啟動 DuckDB。請務必使用您機器上的正確路徑,并將 user 替換為您正確的用戶名:

$ /home/user/.duckdb/cli/latest/duckdb

在這里插入圖片描述

如果需要幫助,請查看安裝指南。

??獲取parquet文件:restaurant_orders.parquet

預覽 restaurant_orders.parquet的前5行數據, 執行:

SELECT * FROM read_parquet('restaurant_orders.parquet') LIMIT 5;

輸出結果大致如下:

┌──────────┬───────────────┬───┬─────────────────────┬────────────────┐
│ order_id │ customer_name │ … │     order_time      │ payment_method │
│  int64   │    varchar    │   │       varchar       │    varchar     │
├──────────┼───────────────┼───┼─────────────────────┼────────────────┤
│        1 │ Grace         │ … │ 2024-02-01 18:00:00 │ PayPal         │
│        2 │ David         │ … │ 2024-02-01 18:05:00 │ Credit Card    │
│        3 │ Eve           │ … │ 2024-02-01 18:10:00 │ PayPal         │
│        4 │ Grace         │ … │ 2024-02-01 18:15:00 │ PayPal         │
│        5 │ Charlie       │ … │ 2024-02-01 18:20:00 │ Debit Card     │
├──────────┴───────────────┴───┴─────────────────────┴────────────────┤
│ 5 rows                                          8 columns (4 shown) │
└─────────────────────────────────────────────────────────────────────┘

理解數據集結構

為了理解數據集的模式,我們可以運行:

DESCRIBE SELECT * FROM read_parquet('restaurant_orders.parquet') LIMIT 5;

這將顯示每個列的數據類型及其他信息。

┌────────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│  column_name   │ column_type │  null   │   key   │ default │  extra  │
│    varchar     │   varchar   │ varchar │ varchar │ varchar │ varchar │
├────────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ order_id       │ BIGINT      │ YES     │ NULL    │ NULL    │ NULL    │
│ customer_name  │ VARCHAR     │ YES     │ NULL    │ NULL    │ NULL    │
│ table_number   │ BIGINT      │ YES     │ NULL    │ NULL    │ NULL    │
│ menu_item      │ VARCHAR     │ YES     │ NULL    │ NULL    │ NULL    │
│ price          │ DOUBLE      │ YES     │ NULL    │ NULL    │ NULL    │
│ quantity       │ BIGINT      │ YES     │ NULL    │ NULL    │ NULL    │
│ order_time     │ VARCHAR     │ YES     │ NULL    │ NULL    │ NULL    │
│ payment_method │ VARCHAR     │ YES     │ NULL    │ NULL    │ NULL    │
└────────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘

執行基本分析

現在讓我們開始分析數據。

  1. 統計訂單總數

讓我們來看看數據集中有多少訂單:

SELECT COUNT(*) AS total_orders FROM read_parquet('restaurant_orders.parquet');

輸出結果:

┌──────────────┐
│ total_orders │
│    int64     │
├──────────────┤
│      30      │
└──────────────┘
  1. 計算總收入

讓我們看看這家餐廳產生了多少收入:

SELECT SUM(price * quantity) AS total_revenue FROM read_parquet('restaurant_orders.parquet');

輸出結果:

┌────────────────────┐
│   total_revenue    │
│       double       │
├────────────────────┤
│ 1770.9800000000005 │
└────────────────────┘
  1. 查找最受歡迎的菜品
    哪些菜品的銷量最高呢?讓我們按菜品名稱(menu_item)進行分組,并匯總數量:
SELECT menu_item, SUM(quantity) AS total_quantity
FROM read_parquet('restaurant_orders.parquet')
GROUP BY menu_item
ORDER BY total_quantity DESC
LIMIT 5;

輸出結果:

┌───────────┬────────────────┐
│ menu_item │ total_quantity │
│  varchar  │     int128     │
├───────────┼────────────────┤
│ Pizza     │             16 │
│ Sushi     │             15 │
│ Salad     │             14 │
│ Tacos     │             14 │
│ Soup      │              7 │
└───────────┴────────────────┘
  1. 按支付方式分析銷售額
    顧客是通過何種方式支付餐費的呢?讓我們來一探究竟:
SELECT payment_method, COUNT(*) AS order_count
FROM read_parquet('restaurant_orders.parquet')
GROUP BY payment_method
ORDER BY order_count DESC;

輸出:

┌────────────────┬─────────────┐
│ payment_method │ order_count │
│    varchar     │    int64    │
├────────────────┼─────────────┤
│ PayPal         │           9 │
│ Credit Card    │           8 │
│ Cash           │           7 │
│ Debit Card     │           6 │
└────────────────┴─────────────┘

高級分析與窗口函數

窗口函數可以幫助計算有趣的信息:

  1. 一段時間內的總收益

讓我們算一下營業收入:

SELECT order_time, SUM(price * quantity) OVER (ORDER BY order_time) AS running_revenue
FROM read_parquet('restaurant_orders.parquet');

從 Parquet 文件中讀取餐廳訂單數據,并計算隨時間累積的營業收入。具體邏輯如下:

  1. 先對每行計算單筆訂單收入:price * quantity
  2. 通過窗口函數 SUM(...) OVER (ORDER BY order_time),按 order_time 升序排列,累加所有歷史訂單收入。

結果running_revenue 表示從第一條訂單到當前行的累計總收入。

核心用途:

  • 實時營收監控:觀察收入隨時間的變化趨勢。
  • 業務分析:識別高峰時段或促銷活動的收入貢獻。
  • 數據驗證:檢查訂單金額與累計值的邏輯一致性。

擴展性:可結合 PARTITION BY(如按門店或服務員分組)實現多維度累積分析。

  1. 最昂貴訂單排名

現在我們將找出最昂貴的訂單:

SELECT order_id, customer_name, price * quantity AS order_value,RANK() OVER (ORDER BY price * quantity DESC) AS rank
FROM read_parquet('restaurant_orders.parquet')
LIMIT 5;

輸出:

┌──────────┬───────────────┬────────────────────┬───────┐
│ order_id │ customer_name │    order_value     │ rank  │
│  int64   │    varchar    │       double       │ int64 │
├──────────┼───────────────┼────────────────────┼───────┤
│       24 │ Hannah        │             175.36 │     1 │
│        6 │ Hannah        │             126.87 │     2 │
│       17 │ David         │ 125.10000000000001 │     3 │
│       14 │ Charlie       │             119.25 │     4 │
│       20 │ Charlie       │             119.13 │     5 │
└──────────┴───────────────┴────────────────────┴───────┘

總結:

DuckDB使處理Parquet文件變得高效——允許我們快速分析結構化數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75655.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75655.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75655.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

異步框架使用loguru和contextvars實現日志按Id輸出

需求闡述 工作中使用fastStream模塊消費kafka事件的時候,遇到以下問題。1. 由于main.py模塊要用到許多其他模塊 ,main模塊,和其他模塊都有日志輸出。2. 要實現異步消費事件,但是又不希望日志打印的很亂。3. 想著在每次消費事件的…

【HTTPS協議】

文章目錄 一、HTTPS二、HTTPS協議五種加密方案1.只使用對稱加密2.只使用非對稱加密3.雙方都使用非對稱加密4.對稱加密非對稱加密中間人攻擊理解數字簽名CA機構和證書 5. 對稱加密非對稱加密證書認證中間人篡改證書?中間人調包整個證書? 常見問題總結 一、…

算法設計學習8

實驗目的及要求: 通過深入學習樹(Tree)和二叉樹(Binary Tree)這兩種重要的數據結構,掌握它們的基本概念、性質和操作,提高對樹形結構的理解和應用能力。通過本實驗,學生將深化對樹和…

P17_ResNeXt-50

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 一、模型結構 ResNeXt-50由多個殘差塊(Residual Block)組成,每個殘差塊包含三個卷積層。以下是模型的主要結構&#xff1…

【YOLO系列(V5-V12)通用數據集-剪刀石頭布手勢檢測數據集】

YOLO格式的剪刀石頭布手勢檢測數據集,適用于YOLOv5-v11所有版本,可以用于本科畢設、發paper、做課設等等,有需要的在這里獲取: 【YOLO系列(V5-V12)通用數據集-剪刀石頭布手勢檢測數據集】 數據集專欄地址&a…

基于連接池與重試機制的高效TDengine寫入方案

摘要 在時序數據庫應用場景中,如何構建穩定高效的寫入機制是核心挑戰。本文基于提供的Python代碼實現,解析一種結合連接池管理、智能重試策略和事務控制的TDengine寫入方案,并分析其技術優勢與優化方向。 一、代碼 from dbutils.pooled_db import PooledDB import timede…

抖音熱點視頻識別與分片處理機制解析

抖音作為日活數億的短視頻平臺,其熱點視頻識別和分片處理機制是支撐高并發訪問的核心技術。以下是抖音熱點視頻識別與分片的實現方案: 熱點視頻識別機制 1. 實時行為監控系統 用戶行為聚合:監控點贊、評論、分享、完播率等指標的異常增長曲線內容特征分析:通過AI識別視頻…

基于RDK X3的“校史通“機器人:SLAM導航+智能交互,讓校史館活起來!

視頻標題: 【校史館の新晉頂流】RDK X3機器人:導覽員看了直呼內卷 視頻文案: 跑得賊穩團隊用RDK X3整了個大活——給校史館造了個"社牛"機器人! 基于RDK X3開發板實現智能導航與語音交互SLAM技術讓機器人自主避障不…

Metal學習筆記十三:陰影

在本章中,您將了解陰影。陰影表示表面上沒有光。當另一個表面或對象使對象與光線相遮擋時,您會看到對象上的陰影。在項目中添加陰影可使您的場景看起來更逼真,并提供深度感。 陰影貼圖 陰影貼圖是包含場景陰影信息的紋理。當光線照射到物體…

Matplotlib:數據可視化的藝術與科學

引言:讓數據開口說話 在數據分析與機器學習領域,可視化是理解數據的重要橋梁。Matplotlib 作為 Python 最流行的繪圖庫,提供了從簡單折線圖到復雜 3D 圖表的完整解決方案。本文將通過實際案例,帶您從基礎繪圖到高級定制全面掌握 …

Python數據可視化-第4章-圖表樣式的美化

環境 開發工具 VSCode庫的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本書為《Python數據可視化》一書的配套內容,本章為第4章 圖表樣式的美化 本章主要介紹了圖表樣式的美化,包括圖表樣式概述、使用顏色、選擇線型、添加數據標記、設置字體…

嵌入式海思Hi3861連接華為物聯網平臺操作方法

1.1 實驗目的 快速演示 1、認識輕量級HarmonyOS——LiteOS-M 2、初步掌握華為云物聯網平臺的使用 3、快速驅動海思Hi3861 WIFI芯片,連接互聯網并登錄物聯網平臺

如何在Redis容量限制下保持熱點數據

如何在Redis容量限制下保持熱點數據 當數據庫有100萬條數據但Redis只能保存10萬條時,需要智能的策略來確保Redis中存儲的都是最常訪問的熱點數據。以下是幾種有效的解決方案: 一、內存淘汰策略 Redis提供了多種內存淘汰機制,當內存不足時會自動刪除部分數據: 策略命令/配…

cv2.fillPoly()和cv2.polylines()

參數解釋 cv2.fillPoly() 和 cv2.polylines() 都是 OpenCV 的函數。功能是繪制多邊形,cv2.fillPoly()可繪制實心多邊形, cv2.polylines() 可繪制空心多邊形 cv2.fillPoly()用途:提取ROI 可在黑色圖像上,填充白色,作為…

數據庫--SQL

SQL:Structured Query Language,結構化查詢語言 SQL是用于管理關系型數據庫并對其中的數據進行一系列操作(包括數據插入、查詢、修改刪除)的一種語言 分類:數據定義語言DDL、數據操縱語言DML、數據控制語言DCL、事務處…

【python】速通筆記

Python學習路徑 - 從零基礎到入門 環境搭建 安裝Python Windows: 從官網下載安裝包 https://www.python.org/downloads/Mac/Linux: 通常已預裝,可通過終端輸入python3 --version檢查 配置開發環境 推薦使用VS Code或PyCharm作為代碼編輯器安裝Python擴展插件創建第…

批量刪除git本地分支和遠程分支命令

1、按照關鍵詞開頭匹配刪除遠程分支 git branch -r | grep "origin/feature/develop-1"| sed s/origin\///g | xargs -n 1 git push origin --delete git branch -r 列出所有遠端分支。 grep "origin/feature/develop-1" 模糊匹配分支名稱包含"orig…

上市電子制造企業如何實現合規的質量文件管理?

浙江潔美電子科技股份有限公司成立于2001年,是一家專業為片式電子元器件(被動元件、分立器件、集成電路及LED)配套生產電子薄型載帶、上下膠帶、離型膜、流延膜等產品的國家高新技術企業,主要產品有分切紙帶、打孔經帶、壓孔紙帶、上下膠帶、塑料載帶及其…

leetcode數組-有序數組的平方

題目 題目鏈接:https://leetcode.cn/problems/squares-of-a-sorted-array/ 給你一個按 非遞減順序 排序的整數數組 nums,返回 每個數字的平方 組成的新數組,要求也按 非遞減順序 排序。 輸入:nums [-4,-1,0,3,10] 輸出&#xff…

基于微信小程序的醫院掛號預約系統設計與實現

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術,讓傳統數據信息的管理升級為軟件存儲,歸納,集中處理數據信息的管理方式。本微信小程序醫院掛號預約系統就是在這樣的大環境下誕生,其可以幫助管理者在短時間內處理完畢龐大…