當我們把巨量資料(例如百萬筆的電商交易紀錄或伺服器 Log)成功匯入 PySpark 後,下一步通常不是立刻進行複雜的機器學習,而是「把不要的資料丟掉」。在大數據的領域有一句名言:「Filter Early(盡早過濾)」。提早剔除無關的欄位與列,可以大幅減少記憶體的消耗與網路傳輸的負擔。
今天,我們就來學習 PySpark DataFrame 中最常被使用的兩把手術刀:切分「行(欄位)」的 select(),以及切分「列(資料筆數)」的 filter()。
1. 觀念解析:Select 與 Filter 有什麼不同?
對於剛接觸資料處理的同學,有時候會把這兩個動作搞混。請參考下方的圖解:
▲ Select (選取欄位) 與 Filter (過濾資料列) 的差異示意圖
2. Select:挑選你真正需要的欄位
假設我們有一份包含數十個欄位的電子商務交易資料,但我們今天只關心「商品名稱」與「交易金額」。我們可以使用 select() 搭配 PySpark 強大的 col() 函數來抽取出我們想要的資料。
# 記得先匯入 col 函數,這是操作欄位的好幫手
from pyspark.sql.functions import col
# 方法一:直接傳入字串(最簡單)
df_selected = df.select("Product_Name", "Price")
# 方法二:使用 col() 函數(推薦!因為後續可以搭配運算)
df_selected = df.select(col("Product_Name"), col("Price"))
df_selected.show(5)
3. Filter / Where:設定條件,過濾雜訊
filter()(與 where() 完全等價)用來篩選符合條件的「資料列」。例如,我們只想看交易金額大於 1000 元的訂單,或是商品分類屬於「3C產品」的紀錄。
# 篩選金額大於 1000 的資料
df_filtered = df.filter(col("Price") > 1000)
# 篩選特定類別,並且金額小於 500 的資料 (多重條件)
# 注意:多條件時,每個條件必須用括號包起來,並使用 & (AND) 或 | (OR)
df_multi_filtered = df.filter(
(col("Category") == "3C產品") & (col("Price") < 500)
)
df_multi_filtered.show()
4. 進階必學技巧:when().otherwise() 條件分群
有時候我們不是要刪除資料,而是要根據條件「貼標籤」。例如:金額大於 1000 標記為「高消費」,否則標記為「一般消費」。這時 when() 就派上用場了,它就像是 Excel 裡的 IF 函數,或是 SQL 裡的 CASE WHEN。
from pyspark.sql.functions import when
# 新增一個欄位 "Customer_Type"
df_tagged = df.withColumn(
"Customer_Type",
when(col("Price") > 1000, "高消費").otherwise("一般消費")
)
df_tagged.select("Product_Name", "Price", "Customer_Type").show(5)
5. 課後小結
熟練運用 select() 與 filter() 搭配 col() 函數,就等於掌握了大數據探索的望遠鏡與過濾網。在下一篇文章中,我們將學習如何對資料進行「塑形」,包含變更資料型態 (Cast)、處理遺失值,以及運算出全新的欄位!

沒有留言:
張貼留言