DuckDB 以其優異的讀取速度和分析效能,在資料科學領域迅速崛起。它不需要額外設定伺服器,可以直接在應用程式中嵌入使用,大幅簡化了資料分析流程。對於處理大量資料的台灣工程師來說,DuckDB 的向量化執行引擎和最佳化的查詢規劃器,能有效提升資料處理效率,縮短分析時間。此外,它與 Python 生態的無縫整合,讓資料科學家能更方便地使用熟悉的工具進行資料探索和分析。無論是處理 CSV、Parquet 或 JSON 等格式的資料,DuckDB 都能提供高效與便捷的解決方案,這對於講求效率的台灣開發環境來說,無疑是一大利器。

尤其在講求速度的資料分析競賽和專案中,DuckDB 的輕量級特性和高效能表現更能凸顯其優勢。它能快速載入和處理大量資料,並支援標準 SQL 語法,讓使用者能快速進行資料查詢、聚合和分析。此外,它也支援地理空間資料處理和 JSON 解析,擴充套件了其應用範圍。對於需要快速驗證資料分析模型或進行探索性資料分析的資料科學家來說,DuckDB 提供了一個極具效率與易於使用的工具。

DuckDB 快速上手:高效資料分析與報表生成

DuckDB 是一個快速、輕量級的嵌入式資料函式庫,專為分析型查詢而設計。它能讓你直接在應用程式中進行高效的資料分析,而無需額外的伺服器設定。本文玄貓將帶領大家快速瞭解 DuckDB 的核心概念與應用,讓你輕鬆上手這個強大的工具。

為何選擇 DuckDB?玄貓的經驗分享

DuckDB 在近年來備受關注,原因在於它解決了許多資料分析的痛點。以下是玄貓認為 DuckDB 脫穎而出的幾個關鍵原因:

  • 高效能分析查詢: DuckDB 針對分析查詢進行了最佳化,速度非常快。
  • 多語言整合: 它可以與 Python、R、Java 等多種程式語言無縫整合,使用非常方便。
  • 開放原始碼: DuckDB 是開放原始碼專案,社群活躍,可以免費使用。

DuckDB 初體驗:快速上手

讓玄貓帶領大家快速體驗 DuckDB 的基本操作。

資料載入:從 CSV 開始

DuckDB 可以直接讀取 CSV 檔案,非常方便。

import duckdb

# 建立連線
con = duckdb.connect(database=':memory:', read_only=False)

# 建立表格並從 CSV 載入資料
con.execute("""
    CREATE TABLE trips AS
    SELECT * FROM read_csv_auto('yellow_tripdata_2023-01.csv')
""")

資料查詢:SQL 的力量

DuckDB 支援標準 SQL 語法,可以輕鬆查詢資料。

# 查詢表格前 5 筆資料
con.execute("SELECT * FROM trips LIMIT 5").fetchdf()

聚合分析:洞察資料

DuckDB 提供了強大的聚合功能,可以進行各種資料分析。

# 計算總行程距離
con.execute("SELECT sum(trip_distance) FROM trips").fetchone()

表格連線:關聯分析

DuckDB 支援表格連線,可以進行更複雜的關聯分析。

# 假設你有另一個表格 zones
con.execute("""
    SELECT trips.*, zones.zone
    FROM trips
    JOIN zones ON trips.pickup_zone_id = zones.zone_id
    LIMIT 5
""").fetchdf()

從 Pandas 讀取資料:無縫整合

DuckDB 可以直接從 Pandas DataFrame 讀取資料,方便資料科學家使用。

import pandas as pd

# 建立 Pandas DataFrame
data = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data)

# 從 DataFrame 建立 DuckDB 表格
con.register('my_table', df)
con.execute("SELECT * FROM my_table").fetchdf()

DuckDB 效率提升的秘密:玄貓的深入分析

DuckDB 之所以高效,主要歸功於以下幾點:

  • 向量化執行: DuckDB 採用向量化執行引擎,一次處理多個資料列,減少了函式呼叫的開銷。
  • 查詢最佳化: DuckDB 具有先進的查詢最佳化器,可以自動選擇最佳的執行計畫。
  • 記憶體管理: DuckDB 針對記憶體使用進行了最佳化,可以高效處理大型資料集。

DuckDB 實戰:資料匯入技巧

讓玄貓來分享一些 DuckDB 資料匯入的實用技巧。

建立 DuckDB 資料函式庫

DuckDB 可以建立記憶體資料函式庫或磁碟資料函式庫。

# 記憶體資料函式庫
con = duckdb.connect(database=':memory:', read_only=False)

# 磁碟資料函式庫
con = duckdb.connect(database='my_database.duckdb', read_only=False)

匯入不同格式的資料

DuckDB 支援多種資料格式,包括 CSV、Parquet、Excel 等。

  • CSV 檔案:
con.execute("CREATE TABLE my_table AS SELECT * FROM read_csv_auto('my_file.csv')")
  • Parquet 檔案:
con.execute("CREATE TABLE my_table AS SELECT * FROM read_parquet('my_file.parquet')")
  • Excel 檔案:
import pandas as pd
df = pd.read_excel('my_file.xlsx')
con.register('my_table', df)
con.execute("SELECT * FROM my_table").fetchdf()

從 MySQL 匯入資料

DuckDB 也可以從 MySQL 資料函式庫匯入資料。

import duckdb
import mysql.connector

# 連線到 MySQL
mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  password="yourpassword",
  database="mydatabase"
)

# 建立 DuckDB 連線
con = duckdb.connect(database=':memory:', read_only=False)

# 從 MySQL 匯入資料
con.execute("CREATE TABLE my_table AS SELECT * FROM mysql_scan('mydatabase', 'mytable')")

SQL 語法速成:DuckDB CLI 的妙用

讓玄貓來介紹如何使用 DuckDB CLI 工具。

啟動 DuckDB CLI

在終端機輸入 duckdb 即可啟動 DuckDB CLI。

匯入資料

CREATE TABLE trips AS SELECT * FROM read_csv_auto('yellow_tripdata_2023-01.csv');

點命令

DuckDB CLI 提供了許多方便的點命令,例如 .tables 可以顯示所有表格。

資料函式庫持久化

DuckDB 預設使用記憶體資料函式庫,可以使用 .backup 命令將資料函式庫儲存到磁碟。

DuckDB 與 Polars 的完美結合:加速資料處理

Polars 是一個快速的 DataFrame 函式庫,與 DuckDB 整合可以進一步提升資料處理效能。讓玄貓來介紹如何使用。

建立 Polars DataFrame

import polars as pl

# 建立 Polars DataFrame
df = pl.DataFrame({'col1': [1, 2], 'col2': [3, 4]})

使用 DuckDB 查詢 Polars DataFrame

import duckdb

# 建立 DuckDB 連線
con = duckdb.connect(database=':memory:', read_only=False)

# 使用 sql() 函式
con.execute("SELECT * FROM df").fetchdf()

# 使用 DuckDBPyRelation 物件
rel = duckdb.from_relation(df)
rel.execute("SELECT * FROM relation_name").fetchdf()

DuckDB 探索性資料分析 (EDA):挖掘資料價值

讓玄貓帶領大家使用 DuckDB 進行探索性資料分析。

載入資料集

import duckdb

# 建立連線
con = duckdb.connect(database=':memory:', read_only=False)

# 建立表格並從 CSV 載入資料
con.execute("""
    CREATE TABLE flights AS
    SELECT * FROM read_csv_auto('flight_delays_2015.csv')
""")

地理空間分析

DuckDB 支援地理空間分析,可以繪製地圖。

# 顯示所有機場在地圖上
con.execute("""
    SELECT * FROM st_read('airports.geojson')
""").fetchdf()

描述性分析

DuckDB 可以進行各種描述性統計分析。

# 找出每個州和城市的機場
con.execute("""
    SELECT state, city, COUNT(*) AS airport_count
    FROM airports
    GROUP BY state, city
    ORDER BY airport_count DESC
""").fetchdf()

DuckDB 與 JSON:輕鬆處理半結構化資料

讓玄貓來介紹如何使用 DuckDB 處理 JSON 檔案。

JSON 基礎

JSON 是一種常用的半結構化資料格式,包含物件、字串、布林值、數字、巢狀物件、陣列和空值。

載入 JSON 檔案

DuckDB 提供了多種方式載入 JSON 檔案。

  • read_json_auto() 函式:
con.execute("CREATE TABLE my_table AS SELECT * FROM read_json_auto('my_file.json')")
  • read_json() 函式:
con.execute("CREATE TABLE my_table AS SELECT * FROM read_json('my_file.json')")
  • COPY-FROM 語法:
con.execute("CREATE TABLE my_table (col1 VARCHAR, col2 INTEGER)")
con.execute("COPY my_table FROM 'my_file.json' (FORMAT 'json')")

DuckDB 與 JupySQL:互動式資料分析

JupySQL 是一個 Jupyter Notebook 的 SQL 擴充功能,可以與 DuckDB 整合,提供互動式資料分析體驗。讓玄貓來介紹如何使用。

安裝 JupySQL

pip install jupysql

載入 SQL 擴充功能

%load_ext sql

連線 DuckDB

%sql duckdb:///:memory:

執行查詢

%%sql
SELECT * FROM my_table LIMIT 5

DuckDB 遠端資料存取:雲端資料分析

DuckDB 可以透過 httpfs 擴充功能存取遠端資料,例如雲端儲存上的 CSV 和 Parquet 檔案。讓玄貓來介紹如何使用。

安裝 httpfs 擴充功能

con.execute("INSTALL httpfs")
con.execute("LOAD httpfs")

查詢遠端 CSV 檔案

con.execute("SELECT * FROM read_csv_auto('https://example.com/my_file.csv')").fetchdf()

探索 DuckDB 的無限可能:從本地到雲端的資料分析之旅

在當今這個資料爆炸的時代,高效地分析和提取巨量資料中的洞見變得前所未有地重要。無論是企業、研究人員還是資料愛好者,都在不斷尋找能夠簡化分析流程、提供卓越效能,同時避免傳統資料函式庫系統常見的額外負擔的工具。DuckDB 正是在這樣的背景下應運而生,它是一個強大的、專為分析工作負載設計的記憶體內資料倉管理系統。DuckDB 以其簡潔性、效率和多功能性脫穎而出,成為從個體資料科學家到大型企業的理想選擇。

本章旨在成為您理解和掌握 DuckDB 的綜合,提供讀者所需的知識和工具,以便在各種應用中充分發揮其潛力。從最初的安裝到進階的查詢技術,每個章節都將引導您完成一個結構良好的學習路徑。我們的目標是讓初學者和有經驗的使用者都能夠有效地利用 DuckDB,無論是用於個人專案還是在更大的組織框架內。

DuckDB 入門:高效能分析查詢的首選

第一章將介紹 DuckDB,探索其獨特的功能以及相較於其他資料函式庫解決方案的優勢。我們將探討為什麼 DuckDB 是高效能分析查詢的首選,並展示其與多種程式語言和環境無縫整合的能力。本章為更深入地探索使 DuckDB 成為資料分析引人注目的選擇的功能奠定了基礎。

資料匯入:構建 DuckDB 資料函式庫的根本

第二章深入研究將資料匯入 DuckDB 的實際操作。您將學習如何建立資料函式庫、從各種來源(如 CSV、Parquet 和 Excel 檔案)載入資料,以及利用不同的方法載入資料,包括 SQL 查詢和註冊方法。這些基礎知識對於在 DuckDB 中高效地處理資料至關重要。

SQL 基礎:DuckDB 使用者的必備技能

在第三章中,我們將提供一個專為 DuckDB 使用者量身定製的 SQL 基礎教程。理解 SQL 對於任何資料分析師或工程師來說都是必不可少的,本章將涵蓋從基本命令到複雜的連線和聚合的所有內容。這些實作範例將幫助您熟練地查詢和操作資料,並讓您更熟悉 DuckDB 的 SQL 語法。

DuckDB 與 Polars:資料分析的完美結合

在第三章的 SQL 知識的基礎上,第四章介紹了 Polars,這是一個令人興奮的 DataFrame 函式庫,可以與 DuckDB 完美協同工作。本章將引導您使用 DuckDB 建立、操作和查詢 Polars DataFrames,同時強調延遲評估和高效記憶體使用的優勢。Polars 和 DuckDB 結合在一起可以顯著增強您的資料分析工作流程,本章將展示如何利用它們的組合力量。

DuckDB 探索性資料分析:揭示資料背後的故事

第五章將重點轉向探索性資料分析 (EDA),並以 2015 年航班延誤和取消資料集作為一個實際的案例研究。在這裡,您將學習如何進行各種分析,從基本的描述性統計到使用 DuckDB 空間擴充進行進階的地理空間分析。本章提供了對真實世界資料挑戰的深入瞭解,並展示瞭如何使用 DuckDB 來揭示資料中有意義的模式和趨勢。

JSON 檔案處理:DuckDB 的靈活資料處理能力

第六章探討了使用 JSON 檔案的複雜性,JSON 檔案是當今 Web 應用程式中常見的資料格式。您將學習如何在 DuckDB 中載入、查詢和匯出 JSON 資料,包括處理複雜的巢狀結構和陣列。理解如何有效地處理 JSON 可以擴充套件您在資料操作和分析方面的能力。

JupySQL 的整合:DuckDB 與 Jupyter Notebook 的無縫協作

在第七章中,我們將探索 JupySQL,這是一個強大的工具,可將 SQL 功能直接整合到 Jupyter Notebook 中。本章將涵蓋將 DuckDB 與 Jupyter 結合使用的安裝、使用和最佳實務,從而實作互動式和視覺化資料分析。您還將發現如何建立引人注目的視覺化效果,以有效地呈現您的資料洞見。

遠端資料存取:DuckDB 的無界資料探索

隨著我們的進展,第八章重點介紹了使用 DuckDB 的 httpfs 擴充功能存取遠端資料。本章將教您如何查詢託管在 GitHub 和 Hugging Face 等平台上的遠端 CSV 和 Parquet 檔案,使您能夠處理來自任何地方的資料集。存取和分析遠端資料的能力為資料探索和協作開闢了新的途徑。

MotherDuck 雲端整合:DuckDB 的未來之路

第九章將探討透過 MotherDuck 在雲端中使用 DuckDB,從而結束本章。您將學習如何註冊 MotherDuck、建立和管理資料函式庫,以及執行結合本機和雲端資料集的混合查詢。本章重點介紹了以雲端為中心的資料分析的未來,為您提供了適應資料管理新興趨勢的工具。

DuckDB:快速上手與實戰技巧

DuckDB 是一個近年來備受關注的資料函式庫系統,它以其卓越的效能、便捷的嵌入式特性和強大的分析能力,在資料分析領域佔據了一席之地。本章旨在引導讀者快速掌握 DuckDB 的核心概念與實用技巧,無論你是資料科學家、軟體開發者或是資料倉管理員,都能從中獲益。

玄貓將帶領大家踏上 DuckDB 之旅,探索其在各個領域的應用,並提供實用的案例和最佳實踐,提升你對這個強大資料函式庫系統的理解與應用能力。

本章慣例

本章採用以下排版慣例:

  • 斜體:表示新術語、URL、電子郵件地址、檔案名稱和副檔名。
  • 等寬字型:用於程式碼清單,以及在段落中參照程式元素,例如變數或函式名稱、資料函式庫、資料型別、環境變數、陳述式和關鍵字。
  • 等寬粗體:表示使用者應按字面輸入的命令或其他文字。在某些情況下,等寬粗體用於突出顯示當前正在討論的程式碼。
  • 等寬斜體:表示應替換為使用者提供的值或由上下文確定的值的文字。

程式碼範例的使用

本章的補充材料(程式碼範例、練習等)可在 https://oreil.ly/supp-DuckDB 下載。

如果你在使用程式碼範例時遇到技術問題,請傳送電子郵件至 support@oreilly.com

本章旨在幫助你完成工作。一般來說,如果本章提供範例程式碼,你可以在你的程式和檔案中使用它。除非你要複製大量的程式碼,否則你不需要聯絡我們徵求許可。

例如,編寫一個使用本章中多個程式碼塊的程式不需要許可。銷售或分發 O’Reilly 書籍中的範例需要許可。參照本章並參照範例程式碼來回答問題不需要許可。將本章中的大量範例程式碼納入你產品的檔案中需要許可。

我們感謝但不通常要求署名。署名通常包括標題、作者、出版商和 ISBN。例如:「DuckDB: Up and Running by Wei-Meng Lee (O’Reilly). Copyright 2025 Wei-Meng Lee, 978-1-098-15969-6。」

如果你認為你對程式碼範例的使用超出了合理使用範圍或上述給予的許可,請隨時透過 permissions@oreilly.com 聯絡我們。

O’Reilly 線上學習平台

40 多年來,O’Reilly Media 一直提供技術和商業培訓、知識和見解,以幫助公司取得成功。

我們獨特的專家和創新者網路透過書籍、文章和我們的線上學習平台分享他們的知識和專業知識。O’Reilly 的線上學習平台讓你隨時隨地存取現場培訓課程、深入的學習路徑、互動式編碼環境以及來自 O’Reilly 和 200 多家其他出版商的大量文字和影片。

如何聯絡我們

請將有關本章的意見和問題傳送給出版商:

O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 800-889-8969 (in the United States or Canada) 707-827-7019 (international or local) 707-829-0104 (fax) support@oreilly.com https://oreilly.com/about/contact.html

我們有一個關於這本章的網頁,我們在其中列出勘誤表、範例和任何其他資訊。你可以透過 https://oreil.ly/duckDB_upAndRunning 存取此頁面。

有關我們書籍和課程的新聞和資訊,請存取 https://oreilly.com

在 LinkedIn 上找到我們:https://linkedin.com/company/oreilly-media

在 YouTube 上觀看我們:https://youtube.com/oreillymedia

致謝

玄貓衷心感謝所有為本章的實作做出貢獻的人。

首先,玄貓要感謝我的家人在這段旅程中給予的堅定支援和鼓勵。他們的耐心和理解非常寶貴。

玄貓非常感謝我的技術審閱者——Balachandar Paulraj、Vivek Vaddina、Karen Zhang 和 Akhil Behl。你們的專業知識和深刻的意見極大地提高了本章的品質。你們的貢獻有助於確保內容準確、相關與對讀者有益。

玄貓還要感謝我的內容開發編輯 Melissa Potter。你的指導和對細節的敏銳眼光在塑造章節的結構和流程方面發揮了重要作用,使材料更容易為讀者所接受。

特別感謝我的收購編輯 Andy Kwan,感謝你相信這個專案並提供使其成為現實所需的支援。你的遠見和鼓勵是本章開發的關鍵動力。

玄貓還要感謝我的文案編輯 Penelope Perkins 和我的製作編輯 Clare Laylock,感謝你們提高了本章的可讀性和樂趣!

感謝大家,感謝你們的寶貴貢獻。沒有你們的支援和專業知識,這本章是不可能完成的。

DuckDB 作為一個高效能的嵌入式資料函式庫,在資料分析和處理領域具有廣闊的應用前景。希望本章能幫助你掌握 DuckDB 的核心技術,並將其應用於實際專案中,提升資料處理效率和分析能力。