MotherDuck 作為新興雲端資料函式庫,結合 DuckDB 的高效能與雲端服務的便利性,提供資料分析領域一個嶄新的解決方案。其核心優勢在於簡化的資料函式庫操作流程和整合的 AI 技術,讓資料分析工作變得更有效率與更具智慧。本文將探討 MotherDuck 的資料函式庫分離與重連機制,方便使用者靈活管理資料函式庫,並以實際案例示範 SQL 查詢技巧,讓使用者能深入探索資料的奧秘。此外,MotherDuck 的 AI 輔助分析功能也是一大亮點,透過 prompt_sql()prompt_query 等 AI 函式,即使不熟悉 SQL 語法的使用者也能輕鬆生成 SQL 陳述式並取得查詢結果,大幅降低資料分析的門檻。文章後半部分將著重於 DuckDB CLI 的應用,示範如何透過 CLI 連線 MotherDuck,執行資料函式庫查詢、建立新資料函式庫,以及進行混合查詢,結合本地端和雲端資料函式庫的資料進行分析,展現 MotherDuck 在資料處理和分析方面的靈活性與強大功能。

雲端資料函式庫新星:MotherDuck資料操控與AI輔助分析

在資料分析領域,雲端資料函式庫MotherDuck正以其獨特的優勢嶄露頭角。它不僅簡化了資料函式庫的操作流程,更整合了AI技術,讓資料分析變得前所未有的高效與人工智慧。玄貓(BlackCat)將帶領大家深入瞭解MotherDuck的資料操控技巧,以及如何利用AI功能提升分析效率。

MotherDuck資料函式庫分離與重連:靈活管理你的資料

MotherDuck提供了一種靈活的資料函式倉管理方式:分離(Detach)與重連(Attach)。這個功能讓你可以輕鬆地將資料函式庫從當前的工作環境中暫時移除,而不會刪除資料。

要分離一個資料函式庫,你可以使用DETACH陳述式:

DETACH flights_db;

分離後的資料函式庫會顯示在介面的 “Detached databases” 區域。若要重新連線,只需點選資料函式庫旁邊的三個垂直點,然後選擇 “Attach” 即可。

玄貓(BlackCat)認為,這個功能在需要整理工作區或暫時移除不常用資料函式庫時非常方便。

MotherDuck資料函式庫查詢:深入探索資料的奧秘

MotherDuck讓資料函式庫查詢變得簡單而高效。當你登入MotherDuck時,預設會看到一個查詢儲存格,其中包含一個預設的SQL查詢。這個查詢會從 sample_data 資料函式庫的 service_requests 表格(位於 nyc 結構描述中)提取URL及其各自的計數。

執行查詢後,你可以在視窗右側看到結果中各個欄位的統計資訊,例如 agencycomplaint_typelandmarkresolution_description。點選欄位名稱將顯示更詳細的統計資訊。例如,對於字串欄位 agency,它會顯示唯一機構名稱的計數分佈。如果是數值欄位,則會顯示最大計數、最小計數等摘要統計資訊。

為了更深入地瞭解查詢功能,玄貓(BlackCat)建議使用先前上傳的 Titanic_train 表格進行一些查詢。以下查詢檢索所有 ageembarked 欄位均不為null的乘客:

SELECT
    Survived, PClass, Sex, Age
FROM my_db.Titanic.titanic_train
WHERE age NOT NULL AND embarked NOT NULL;

執行此查詢後,你將在結果的右側看到一個欄位列表。點選 Survived 欄位將顯示一個直方圖,顯示倖存者和未倖存者的人數。類別似地,點選 PClass 欄位會顯示一個直方圖,顯示每個艙等中的乘客數量。對於 Sex 欄位,它會顯示一個長條圖,顯示男性和女性乘客的數量。對於 Age 欄位,它會同時顯示年齡分佈和欄位的摘要統計資訊。

AI加持:用prompt_sql() 輕鬆生成SQL語法

MotherDuck最令人興奮的功能之一是其AI能力。透過AI函式和pragma,你可以執行自動化任務並最佳化分析工作流程。這些工具可以簡化查詢生成、自動化資料分析任務,並直接在資料函式庫環境中利用機器學習演算法。

以下是一些可用的AI函式/pragma:

函式/pragma 功能
prompt_sql() 產生SQL陳述式
prompt_query 回答關於資料的問題
prompt_fixup() 更正和修復SQL查詢
prompt_fix_line() 逐行更正和修復SQL查詢
prompt_schema() 幫助你理解資料函式庫的內容
prompt_explain() 幫助你理解SQL查詢

讓玄貓(BlackCat)用 prompt_sql() 函式作為範例。假設你想知道鐵達尼號上有多少獨自一人的乘客倖存。你可以使用 CALL 陳述式呼叫 prompt_sql() 函式。在提問之前,請務必使用 USE 陳述式設定作用中的資料函式庫:

USE my_db;
CALL prompt_sql("How many people who were alone survived");

結果將是一個產生的SQL陳述式:

SELECT COUNT(*)
FROM Titanic.Titanic_train
WHERE Survived = 1 AND SibSp = 0 AND Parch = 0;

執行此SQL陳述式後,你會得到結果:163。

另一個例子,讓我們計算每個年齡段的生存機率,以確定哪個年齡段的生存率最高。為此,讓我們使用以下問題呼叫該函式:

CALL prompt_sql("Calculate the survival chance for each age group");

該函式將傳回以下SQL陳述式:

SELECT
    CASE
        WHEN Age < 10 THEN '0-9'
        WHEN Age BETWEEN 10 AND 19 THEN '10-19'
        WHEN Age BETWEEN 20 AND 29 THEN '20-29'
        WHEN Age BETWEEN 30 AND 39 THEN '30-39'
        WHEN Age BETWEEN 40 AND 49 THEN '40-49'
        WHEN Age BETWEEN 50 AND 59 THEN '50-59'
        WHEN Age BETWEEN 60 AND 69 THEN '60-69'
        WHEN Age >= 70 THEN '70+'
        ELSE 'Unknown'
    END AS age_group,
    AVG(Survived) * 100 AS survival_chance
FROM Titanic.Titanic_train
GROUP BY age_group
ORDER BY age_group;

執行此查詢將傳回結果,表明兒童在鐵達尼號沉沒時有最大的生存機會。

如果你只想獲得結果而不想要SQL陳述式,可以使用 prompt_query pragma!例如,如果你想知道 airlines 表格中有多少家航空公司,你可以使用以下陳述式:

PRAGMA prompt_query('How many airlines are there?');

它將傳回結果14。

玄貓(BlackCat)認為,MotherDuck的AI功能極大地簡化了資料分析流程,即使是不熟悉SQL語法的使用者也能夠輕鬆地從資料中提取有價值的資訊。

MotherDuck透過簡化資料函式庫操作和整合AI技術,為資料分析帶來了革命性的改變。無論是資料倉管理還是查詢,MotherDuck都提供了高效與易於使用的工具。而AI功能的加入,更讓資料分析變得人工智慧而高效,即使是不熟悉SQL語法的使用者也能夠輕鬆地從資料中提取有價值的資訊。隨著雲端技術的不斷發展,玄貓(BlackCat)相信MotherDuck將在資料分析領域扮演越來越重要的角色。

玄貓解讀:如何用 DuckDB CLI 玩轉 MotherDuck 雲端資料函式庫

在雲端環境下使用 DuckDB,MotherDuck 提供了極大的便利性。除了網頁 UI,我們還能透過 DuckDB CLI 直接在終端機或 SSH 環境下執行查詢。玄貓將帶領大家瞭解如何透過 DuckDB CLI 連線 MotherDuck、查詢資料函式庫、建立新資料函式庫,以及執行混合查詢。

MotherDuck 與 DuckDB CLI 的無縫連線

DuckDB CLI 連線步驟

  1. 啟動 DuckDB CLI
    $ duckdb
    v1.0.0 1f98600c2c
    Enter ".help" for usage hints.
    Connected to a transient in-memory database.
    Use ".open FILENAME" to reopen on a persistent database.
    
  2. 連線到 MotherDuck
    ATTACH 'md:';
    
    系統會自動開啟 SSO 授權頁面。
  3. 授權碼確認 CLI 會產生一組程式碼(例如 CQMP-DQHV),請在瀏覽器中確認並點選 Confirm。
  4. 登入 MotherDuck 如果尚未登入,系統會提示您登入 MotherDuck 帳戶。
  5. 授權 DuckDB CLI 授權 DuckDB CLI 存取您的 MotherDuck 帳戶。
  6. 取得 Token 成功授權後,CLI 會顯示 Token。您可以將 Token 儲存為環境變數,避免重複登入。
    PRAGMA PRINT_MD_TOKEN;
    

連線成功後的提示

看到 “Token successfully retrieved ✅” 的訊息,表示您已成功連線到 MotherDuck。

雲端資料隨手查:MotherDuck 資料函式庫查詢

查詢可用資料函式庫

連線到 MotherDuck 後,首先檢視有哪些可用的資料函式庫:

SHOW databases;

檢視當前資料函式庫

使用 current_database() 函式檢視目前使用的資料函式庫:

SELECT current_database();

檢視當前 Schema

使用 current_schema() 函式檢視目前使用的 Schema:

SELECT current_schema();

查詢特定資料表

指定完整的資料函式庫名稱、Schema 和資料表名稱來查詢資料:

SELECT
    Survived, PClass, Sex, Age
FROM my_db.Titanic.titanic_train
WHERE age NOT NULL AND embarked NOT NULL;

設定預設資料函式庫和 Schema

為了方便查詢,可以使用 USE 陳述式設定預設的資料函式庫和 Schema:

USE my_db.Titanic;

設定後,可以直接使用資料表名稱來查詢:

SELECT count(*) FROM titanic_train;

雲端資料輕鬆建:MotherDuck 資料函式庫建立

上傳資料到 MotherDuck

使用 DuckDB CLI,您可以像在網頁 UI 中一樣,直接將資料上傳到 MotherDuck,並建立新的資料函式庫。

範例:上傳 airports.csv 檔案

CREATE OR REPLACE TABLE my_db.main.airports AS SELECT *
FROM read_csv_auto(['airports.csv']);

請確保 airports.csv 檔案與您啟動 DuckDB CLI 的目錄位於同一位置。

利用 MotherDuck 建立資料函式庫、結構描述與表格

現在,讓玄貓在 MotherDuck 上建立一個新的資料函式庫、結構描述和表格:

D CREATE DATABASE new_db;
D USE new_db;
D CREATE SCHEMA new_schema;
D USE new_schema;
D CREATE TABLE new_schema.example_table (
    id INTEGER,
    name TEXT
);
D INSERT INTO new_schema.example_table (id, name) VALUES (1, 'Sample Data');
D SELECT * FROM new_schema.example_table;

內容解密

  • CREATE DATABASE new_db;:這行程式碼用於建立一個名為 new_db 的新資料函式庫。
  • USE new_db;:這行程式碼用於選取剛剛建立的 new_db 資料函式庫,以便後續操作都在這個資料函式庫中進行。
  • CREATE SCHEMA new_schema;:這行程式碼用於在當前資料函式庫中建立一個名為 new_schema 的新結構描述。
  • USE new_schema;:這行程式碼用於選取剛剛建立的 new_schema 結構描述,以便後續在這個結構描述中建立表格。
  • CREATE TABLE new_schema.example_table (...):這行程式碼用於建立一個名為 example_table 的新表格,其中包含 idname 兩個欄位。
  • INSERT INTO new_schema.example_table (...):這行程式碼用於將一筆範例資料插入到 example_table 表格中。
  • SELECT * FROM new_schema.example_table;:這行程式碼用於查詢 example_table 表格中的所有資料,以驗證資料是否成功插入。

執行上述程式碼後,會看到以下結果:

┌───────┬─────────────┐
   id      name     
 int32    varchar   
├───────┼─────────────┤
   1    Sample Data 
└───────┴─────────────┘

這個範例首先使用您先前取得的令牌連線到 MotherDuck 服務。連線後,您會建立一個名為 new_db 的新資料函式庫,並將其設定為目前的資料函式庫。接下來,您會建立一個新的結構描述,然後在該結構描述中建立一個名為 example_table 的表格。最後,您會將一筆記錄插入到表格中,並驗證該記錄是否已成功插入。您可以重新整理頁面,以驗證新的資料函式庫是否確實已在 MotherDuck 中建立。

混合查詢:本地 DuckDB 與 MotherDuck 的完美結合

MotherDuck 一個非常酷的功能是它能夠執行混合查詢,讓您可以同時查詢本地 DuckDB 資料函式庫和 MotherDuck 中的資料函式庫。

還記得玄貓之前在 MotherDuck 中建立的 airlines 表格嗎?讓玄貓檢視其內容:

D SELECT * from my_db.main.airlines;

內容解密

  • SELECT * from my_db.main.airlines;:這行程式碼用於從 my_db 資料函式庫的 main 結構描述中選取 airlines 表格的所有欄位和列。

執行上述程式碼後,會看到以下結果:

┌───────────┬──────────────────────────────┐
 IATA_CODE            AIRLINE            
  varchar             varchar            
├───────────┼──────────────────────────────┤
    UA      United Air Lines Inc.        
    AA      American Airlines Inc.       
    US      US Airways Inc.              
    F9      Frontier Airlines Inc.       
    B6      JetBlue Airways              
    OO      Skywest Airlines Inc.        
    AS      Alaska Airlines Inc.         
    NK      Spirit Air Lines             
    WN      Southwest Airlines Co.       
    DL      Delta Air Lines Inc.         
    EV      Atlantic Southeast Airlines  
    HA      Hawaiian Airlines Inc.       
    MQ      American Eagle Airlines Inc. 
    VX      Virgin America               
├───────────┴──────────────────────────────┤
 14 rows 2 columns                        
└──────────────────────────────────────────┘

玄貓還有另一個檔案 flights.csv,玄貓想要將其作為 DuckDB 資料函式庫在本地載入。以下陳述式將前 10 列(和兩個欄位)載入到本地資料函式庫中:

D SELECT AIRLINE, FLIGHT_NUMBER FROM './flights.csv' LIMIT 10;

內容解密

  • SELECT AIRLINE, FLIGHT_NUMBER FROM './flights.csv' LIMIT 10;:這行程式碼用於從本地檔案 ./flights.csv 中選取 AIRLINEFLIGHT_NUMBER 兩個欄位的前 10 列資料。

執行上述程式碼後,會看到以下結果:

┌─────────┬───────────────┐
 AIRLINE  FLIGHT_NUMBER 
 varchar       int64      
├─────────┼───────────────┤
    AS           98       
    AA          2336      
    US           840      
    AA           258      
    AS           135      
    DL           806      
    NK           612      
    US          2013      
    AA          1112      
    DL          1173      
├─────────┴───────────────┤
 10 rows 2 columns       
└─────────────────────────┘

對於這個表格,玄貓想要顯示每一列的航空公司名稱。由於每個航空公司都由其航空公司程式碼表示,因此玄貓需要與 airlines 表格(託管在 MotherDuck 上)執行聯結,以顯示完整的航空公司名稱。為此,玄貓可以執行以下混合查詢:

D SELECT f.AIRLINE, f.FLIGHT_NUMBER, a.AIRLINE
FROM (SELECT AIRLINE, FLIGHT_NUMBER FROM './flights.csv' LIMIT 10) AS f
JOIN my_db.main.airlines AS a
ON f.AIRLINE = a.IATA_CODE;

內容解密

  • SELECT f.AIRLINE, f.FLIGHT_NUMBER, a.AIRLINE:選擇航班程式碼、航班號碼和航空公司名稱。
  • FROM (SELECT AIRLINE, FLIGHT_NUMBER FROM './flights.csv' LIMIT 10) AS f:從本地 CSV 檔案 ‘./flights.csv’ 中選擇前 10 筆航班程式碼和航班號碼,並將結果命名為 f。
  • JOIN my_db.main.airlines AS a:將上述結果與 MotherDuck 上的 my_db.main.airlines 表格連線,並將其命名為 a。
  • ON f.AIRLINE = a.IATA_CODE:連線條件為本地 CSV 檔案中的航班程式碼與 MotherDuck 上 airlines 表格中的 IATA 程式碼相同。

執行上述程式碼後,會看到以下結果:

┌─────────┬───────────────┬────────────────────────┐
 AIRLINE  FLIGHT_NUMBER         AIRLINE         
 varchar       int64              varchar         
├─────────┼───────────────┼────────────────────────┤
    AS           98        Alaska Airlines Inc.   
    AA          2336       American Airlines Inc. 
    US           840       US Airways Inc.        
    AA           258       American Airlines Inc. 
    AS           135       Alaska Airlines Inc.   
    DL           806       Delta Air Lines Inc.   
    NK           612       Spirit Air Lines       
    US          2013       US Airways Inc.        
    AA          1112       American Airlines Inc. 
    DL          1173       Delta Air Lines Inc.   
├─────────┴───────────────┴────────────────────────┤
 10 rows 3 columns                       
└──────────────────────────────────────────┘

混合查詢的結果結合了來自本地 DuckDB 資料函式庫和託管在 MotherDuck 上的表格的資料,提供了一個全面的檢視,其中包括航空公司程式碼和相應的完整航空公司名稱。這種方法利用 MotherDuck 的混合查詢功能,在單個查詢執行中無縫整合和分析來自不同來源的資料。