2026年10月29日 星期四

【PySpark 大數據處理 03】資料匯入與輸出:無縫接軌 CSV、JSON 與 Parquet 格式

在了解 DataFrame 的強大之後,我們終於要讓 PySpark 處理真實世界的資料了!在企業的大數據專案中,資料來源五花八門,最常見的莫過於傳統的 CSV 報表、Web API 常用的 JSON 格式,以及在大數據生態系中佔有統治地位的 Parquet。今天這篇文章,我們將實作這三種格式的讀取與寫出,並解析為什麼大數據工程師都獨鍾 Parquet!

1. 傳統辦公室的最愛:CSV 格式

CSV (Comma-Separated Values) 是最平易近人的格式,幾乎所有的試算表軟體都能打開它。但在分散式運算中,CSV 有兩個致命傷:第一,它沒有自帶嚴謹的型態定義 (Schema),Spark 必須多花時間掃描推斷;第二,它讀取與切割的速度較慢。

✏️ PySpark 讀寫 CSV 實作:

# 讀取 CSV 檔案
# header=True 代表第一列是欄位名稱
# inferSchema=True 讓 Spark 自動推斷是數字還是字串 (會稍微拖慢讀取速度)
df_csv = spark.read.csv("data/sales.csv", header=True, inferSchema=True)

df_csv.show(5)

# 將 DataFrame 寫出為 CSV 檔案
# mode("overwrite") 代表如果檔案已存在則覆蓋
df_csv.write.mode("overwrite").csv("output/sales_backup.csv", header=True)

2. 靈活的樹狀結構:JSON 格式

JSON 在網頁前後端與 NoSQL 資料庫中極度普及,它允許資料呈現巢狀 (Nested) 結構。PySpark 能輕鬆攤平這些資料,非常適合用來分析系統伺服器的 Log 日誌。

✏️ PySpark 讀寫 JSON 實作:

# 讀取 JSON 檔案 (Spark 處理 JSON 行格式特別在行)
df_json = spark.read.json("data/server_logs.json")

df_json.printSchema()

# 寫出為 JSON 格式
df_json.write.mode("overwrite").json("output/clean_logs.json")

3. 大數據的王者:Parquet 格式

這可能是資管系碩士班同學進入大數據領域後,最需要深刻理解的格式。Parquet 是一種「欄導向 (Columnar Storage)」的開源檔案格式,擁有極高的壓縮率與驚人的查詢效能。

列導向 (CSV) vs 欄導向 (Parquet) 儲存架構差異 CSV (列導向儲存) 資料以「橫向一筆一筆」的方式寫入硬碟 ID Name Age 101 Alice 24 102 Bob 29 103 Charlie 35 缺點:只查 Age 欄位時,硬碟仍需讀取整列 Parquet (欄導向儲存) 資料以「直向同一屬性」的方式集中儲存 ID Name Age 101 102 103 Alice Bob Charlie 24 29 35 優勢:只查 Age 欄位時,完美略過其他資料
▲ 大數據儲存原理:CSV 與 Parquet 的硬碟讀取方式差異

當我們只想計算全校學生的「平均成績」時,Parquet 格式允許 Spark 直接跳過學號、姓名等無關欄位,唯讀取成績那一個欄位。這在大數據運算中被稱為「Projection Pushdown」,能省下海量的 I/O 讀取時間!

✏️ PySpark 讀寫 Parquet 實作:

# 讀取 Parquet 檔案 (速度極快,且內建 Schema)
df_parquet = spark.read.parquet("data/transactions.parquet")

df_parquet.show(3)

# 養成好習慣:處理完巨量資料後,存成 Parquet 格式
df.write.mode("overwrite").parquet("output/processed_data.parquet")

4. 準備就緒:邁向資料清洗

學會如何把不同格式的資料載入 PySpark 後,我們已經裝填好彈藥了。但在進行高階分析前,原始資料中往往充滿了不需要的欄位與雜訊。下一篇文章,我們將學習如何精準選取 (Select) 與過濾 (Filter) 出我們想要的關鍵資料!

沒有留言:

張貼留言

熱門文章