2026年11月3日 星期二

【PySpark 大數據處理 09】突破語法限制:無縫整合 PySpark 與標準 SQL 查詢

經過前面幾篇的學習,我們已經熟悉了 PySpark DataFrame 專屬的 API 語法(例如 select(), filter(), withColumn(), groupBy())。這些語法非常強大且支援物件導向的串接,但對於許多熟悉關聯式資料庫(如 MySQL、SQL Server)的開發者來說,難免會覺得:「如果能直接寫 SQL 該有多好?」

好消息是,Apache Spark 內建了極度強大的 Spark SQL 引擎。只要透過一個簡單的指令,我們就能在 PySpark 環境中無縫切換,直接用標準的 SQL 語法來查詢百萬級別的大數據!

1. 核心橋樑:認識 TempView (暫存視圖)

PySpark DataFrame 存在於記憶體中,原生的 SQL 引擎無法直接看見它。為了讓 SQL 引擎能對其下達指令,我們必須先將 DataFrame 註冊為一張「虛擬的資料表」,在 Spark 中稱為 TempView。

PySpark 與 Spark SQL 無縫整合架構 PySpark DataFrame 註冊虛擬表 createOrReplaceTempView TempView (暫存視圖) "sales_db" 可被 SQL 辨識 SQL 查詢 spark.sql() 回傳新的 DataFrame SQL 查詢的結果會自動轉回 DataFrame 格式,方便後續串接其他 PySpark 操作
▲ TempView 註冊與 SQL 查詢運作流程

2. 基礎實作:註冊 TempView 並執行 SELECT

假設我們已經載入了一份電商銷售紀錄的 DataFrame (命名為 df_sales)。我們只需要一行程式碼,就能為它建立一個虛擬表名稱,接著就能呼叫 spark.sql() 送出查詢字串。

# 步驟 1:將 DataFrame 註冊為名為 "sales_table" 的暫存表
df_sales.createOrReplaceTempView("sales_table")

# 步驟 2:直接撰寫標準 SQL 語法!
sql_query = """
    SELECT Product_Name, Category, Price
    FROM sales_table
    WHERE Price > 1000
    ORDER BY Price DESC
"""

# 步驟 3:執行查詢。注意!執行結果會回傳一個全新的 DataFrame
df_result = spark.sql(sql_query)

# 步驟 4:使用 DataFrame 的 .show() 檢視結果
df_result.show(5)

3. 進階應用:用 SQL 解決複雜的資料表關聯 (JOIN)

在處理企業真實數據時,訂單資料與客戶資料通常是分開存放的。雖然 PySpark 原生也支援 df.join() 語法,但對於習慣撰寫 INNER JOIN、LEFT JOIN 的開發者來說,直接寫 SQL 往往更直覺,可讀性也更高。

# 假設我們有兩份 DataFrame:銷售紀錄與客戶資料
df_sales.createOrReplaceTempView("sales")
df_customers.createOrReplaceTempView("customers")

# 使用 SQL 進行多表關聯與群組聚合
complex_sql = """
    SELECT 
        c.Customer_Level,
        COUNT(s.Order_ID) AS Total_Orders,
        SUM(s.Price * s.Qty) AS Total_Revenue
    FROM sales s
    LEFT JOIN customers c ON s.Customer_ID = c.Customer_ID
    GROUP BY c.Customer_Level
    HAVING Total_Revenue > 50000
"""

df_report = spark.sql(complex_sql)
df_report.show()

💡 重點提醒: spark.sql() 執行完畢後,回傳的 df_report 依然是 DataFrame 物件!這代表你可以接著使用 df_report.write.parquet(...) 將報表存回硬碟中。PySpark API 與 SQL 語法之間是完全互通、可以穿插使用的!

4. 課後小結

學會了無縫整合 SQL 語法後,大數據分析的技術門檻瞬間降低了許多,以往在資料庫課堂上學到的 SQL 技巧全部都能直接應用在巨量資料上!

到目前為止,我們已經將環境建置、格式匯入、資料清洗 (Filter, withColumn, Null)、樞紐聚合 (GroupBy) 以及 SQL 整合全部學完。萬事俱備,只欠東風!在系列連載的最後一篇(第 10 篇),我們將進行一場從零到有的探索性分析 (EDA) 實戰演練,帶你親身經歷一次大數據專案的完整洗禮!

沒有留言:

張貼留言

熱門文章