2026年10月31日 星期六

【PySpark 大數據處理 06】資料品質守門員:優雅處理缺失值 (Null) 與重複資料

在我們處理巨量資料時,特別是針對物聯網 (IoT)、智慧城市感測器數據或是企業 ESG 永續治理的相關指標,我們幾乎不可能拿到完美的資料。感測器斷線會產生缺失值 (Null),系統重試機制則可能引發重複的紀錄 (Duplicates)。如果帶著這些「髒資料」直接進入分析或機器學習模型,將會導致嚴重的誤差(這就是所謂的 Garbage In, Garbage Out)。

今天,我們將學習 PySpark 內建的資料品質守門員,透過幾個簡單的語法,優雅地處理這些異常資料!

1. 缺失值處理策略:刪除 (Drop) 還是 填補 (Fill)?

當我們遇到欄位空白 (Null 或 NaN) 時,通常有兩種作法:一是將該筆資料整列刪除;二是根據商業邏輯填補一個預設值(例如補 0,或是補上平均數)。

髒資料清洗:Drop 與 Fill 運作機制 原始感測資料 Sensor PM2.5 Status S-01 15.2 OK S-02 NULL NULL ← 缺失值 S-01 15.2 OK ← 重複傳送 dropna() 直接刪除異常列 Sensor | PM2.5 S-01 | 15.2 S-01 | 15.2 fillna(0) 補上預設值 (如 0) Sensor | PM2.5 S-01 | 15.2 S-02 | 0.0 S-01 | 15.2 dropDuplicates 移除重複紀錄 Sensor | PM2.5 S-01 | 15.2 S-02 | NULL
▲ dropna()、fillna() 與 dropDuplicates() 處理機制對照圖

2. 實作一:精準打擊 Null 值的 dropna() 與 fillna()

在 PySpark 中,處理 Null 非常直覺。我們可以選擇只要有任一欄位是 Null 就整列刪除(非常嚴格),或是只有當「指定欄位」是 Null 時才刪除。

# 假設 df 是我們的智慧城市感測器資料

# 【策略 1:嚴格刪除】
# 只要該列有「任何 (any)」一個欄位是 Null,就把整列刪掉
df_clean = df.dropna(how="any")

# 只有當 "PM2_5" 欄位是 Null 時,才把該列刪掉
df_clean_specific = df.dropna(subset=["PM2_5"])

# 【策略 2:智慧補值】
# 將數值型欄位的 Null 全部補為 0
df_filled = df.fillna(value=0)

# 只針對特定欄位補值 (例如 Status 狀態未知時補上 'Unknown')
df_filled_specific = df.fillna(value="Unknown", subset=["Status"])

3. 實作二:消滅重複資料的 dropDuplicates()

-->
[請在此處插入文章首圖]

在我們處理巨量資料時,特別是針對物聯網 (IoT)、智慧城市感測器數據或是企業 ESG 永續治理的相關指標,我們幾乎不可能拿到完美的資料。感測器斷線會產生缺失值 (Null),系統重試機制則可能引發重複的紀錄 (Duplicates)。如果帶著這些「髒資料」直接進入分析或機器學習模型,將會導致嚴重的誤差(這就是所謂的 Garbage In, Garbage Out)。

今天,我們將學習 PySpark 內建的資料品質守門員,透過幾個簡單的語法,優雅地處理這些異常資料!

1. 缺失值處理策略:刪除 (Drop) 還是 填補 (Fill)?

當我們遇到欄位空白 (Null 或 NaN) 時,通常有兩種作法:一是將該筆資料整列刪除;二是根據商業邏輯填補一個預設值(例如補 0,或是補上平均數)。

髒資料清洗:Drop 與 Fill 運作機制 原始感測資料 Sensor PM2.5 Status S-01 15.2 OK S-02 NULL NULL ← 缺失值 S-01 15.2 OK ← 重複傳送 dropna() 直接刪除異常列 Sensor | PM2.5 S-01 | 15.2 S-01 | 15.2 fillna(0) 補上預設值 (如 0) Sensor | PM2.5 S-01 | 15.2 S-02 | 0.0 S-01 | 15.2 dropDuplicates 移除重複紀錄 Sensor | PM2.5 S-01 | 15.2 S-02 | NULL
▲ dropna()、fillna() 與 dropDuplicates() 處理機制對照圖

2. 實作一:精準打擊 Null 值的 dropna() 與 fillna()

在 PySpark 中,處理 Null 非常直覺。我們可以選擇只要有任一欄位是 Null 就整列刪除(非常嚴格),或是只有當「指定欄位」是 Null 時才刪除。

# 假設 df 是我們的智慧城市感測器資料

# 【策略 1:嚴格刪除】
# 只要該列有「任何 (any)」一個欄位是 Null,就把整列刪掉
df_clean = df.dropna(how="any")

# 只有當 "PM2_5" 欄位是 Null 時,才把該列刪掉
df_clean_specific = df.dropna(subset=["PM2_5"])

# 【策略 2:智慧補值】
# 將數值型欄位的 Null 全部補為 0
df_filled = df.fillna(value=0)

# 只針對特定欄位補值 (例如 Status 狀態未知時補上 'Unknown')
df_filled_specific = df.fillna(value="Unknown", subset=["Status"])

3. 實作二:消滅重複資料的 dropDuplicates()

沒有留言:

張貼留言

熱門文章