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 │
└────────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘
執行基本分析
現在讓我們開始分析數據。
- 統計訂單總數
讓我們來看看數據集中有多少訂單:
SELECT COUNT(*) AS total_orders FROM read_parquet('restaurant_orders.parquet');
輸出結果:
┌──────────────┐
│ total_orders │
│ int64 │
├──────────────┤
│ 30 │
└──────────────┘
- 計算總收入
讓我們看看這家餐廳產生了多少收入:
SELECT SUM(price * quantity) AS total_revenue FROM read_parquet('restaurant_orders.parquet');
輸出結果:
┌────────────────────┐
│ total_revenue │
│ double │
├────────────────────┤
│ 1770.9800000000005 │
└────────────────────┘
- 查找最受歡迎的菜品
哪些菜品的銷量最高呢?讓我們按菜品名稱(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 │
└───────────┴────────────────┘
- 按支付方式分析銷售額
顧客是通過何種方式支付餐費的呢?讓我們來一探究竟:
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 │
└────────────────┴─────────────┘
高級分析與窗口函數
窗口函數可以幫助計算有趣的信息:
- 一段時間內的總收益
讓我們算一下營業收入:
SELECT order_time, SUM(price * quantity) OVER (ORDER BY order_time) AS running_revenue
FROM read_parquet('restaurant_orders.parquet');
從 Parquet 文件中讀取餐廳訂單數據,并計算隨時間累積的營業收入。具體邏輯如下:
- 先對每行計算單筆訂單收入:
price * quantity
。 - 通過窗口函數
SUM(...) OVER (ORDER BY order_time)
,按order_time
升序排列,累加所有歷史訂單收入。
結果:running_revenue
表示從第一條訂單到當前行的累計總收入。
核心用途:
- 實時營收監控:觀察收入隨時間的變化趨勢。
- 業務分析:識別高峰時段或促銷活動的收入貢獻。
- 數據驗證:檢查訂單金額與累計值的邏輯一致性。
擴展性:可結合 PARTITION BY
(如按門店或服務員分組)實現多維度累積分析。
- 最昂貴訂單排名
現在我們將找出最昂貴的訂單:
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文件變得高效——允許我們快速分析結構化數據。