Khóa học
PySpark đặc biệt hữu ích khi làm việc với các tập dữ liệu lớn vì cung cấp các phương thức hiệu quả để làm sạch dữ liệu. Trong bài viết này, chúng ta sẽ tập trung vào một tác vụ làm sạch phổ biến: cách loại bỏ cột khỏi DataFrame bằng các phương thức .drop() và .select() của PySpark.
Để tìm hiểu thêm về PySpark, hãy xem khóa học Giới thiệu về PySpark này.
Vì sao cần loại bỏ cột trong PySpark DataFrame?
Loại bỏ cột là một tác vụ phổ biến trong tiền xử lý dữ liệu vì nhiều lý do. Việc loại bỏ các cột không cần thiết hoặc không liên quan có thể giảm đáng kể lượng dữ liệu cần xử lý. Điều này giúp bộ dữ liệu gọn nhẹ hơn, dễ phân tích hơn và có thể cải thiện hiệu năng của các job PySpark.
Ngoài ra, khi chuẩn bị dữ liệu cho mô hình học máy, bước chọn đặc trưng thường liên quan đến việc loại bỏ những cột không đóng góp vào độ chính xác của mô hình hoặc có thể tạo nhiễu. Bước này giúp mô hình hiệu quả và gọn nhẹ hơn.
Cuối cùng, loại bỏ cột cũng có thể là chiến lược cải thiện chất lượng dữ liệu. Nếu một cột chứa tỷ lệ lớn giá trị thiếu hoặc dữ liệu sai, loại bỏ nó có thể là lựa chọn tốt nhất.
Cách loại bỏ một cột khỏi PySpark DataFrame
Giả sử chúng ta có một DataFrame df với năm cột: player_name, player_position, team, minutes_played và score. Cột minutes_played có nhiều giá trị thiếu, nên chúng ta muốn loại bỏ nó.
Trong PySpark, chúng ta có thể loại bỏ một cột khỏi DataFrame bằng phương thức .drop().
Cú pháp là df.drop("column_name") trong đó:
dflà DataFrame mà chúng ta muốn loại bỏ cộtcolumn_namelà tên cột cần loại bỏ.
Phương thức df.drop() trả về một DataFrame mới với các cột đã chỉ định được loại bỏ.
Cách loại bỏ một cột như sau:
df_dropped = df.drop("minutes_played")
Cách loại bỏ nhiều cột khỏi PySpark DataFrame
Giả sử chúng ta muốn phân tích DataFrame df nhưng không muốn xét đến đội bóng hoặc vị trí của cầu thủ — vậy chúng ta muốn loại bỏ cả hai cột này. Có hơn một cách để làm điều đó, hãy cùng xem các lựa chọn.
Để loại bỏ nhiều cột khỏi PySpark DataFrame, chúng ta có thể truyền một danh sách tên cột vào phương thức .drop(). Có hai cách thực hiện:
# Cách 1: Truyền tên cột dưới dạng một danh sách
df_dropped = df.drop(["team", "player_position"])
# Cách 2: Truyền tên cột dưới dạng các đối số riêng lẻ
df_dropped = df.drop("team", "player_position")
Ngoài ra, chúng ta có thể xâu chuỗi nhiều lần gọi .drop(). Mặc dù hoạt động được về mặt kỹ thuật, cách này thường không được coi là hiệu quả hay gọn gàng nhất. Mỗi lần gọi tạo ra một DataFrame mới, có thể gây overhead, đặc biệt khi làm việc với tập dữ liệu lớn.
df_dropped = df.drop("team").drop("player_position")
Loại bỏ cột có điều kiện
Thay vì chỉ định cột nào cần loại bỏ, chúng ta có thể đảo ngược cách tiếp cận và chỉ chọn những cột đáp ứng một điều kiện hay yêu cầu. Khi đó, DataFrame trả về sẽ không còn chứa các cột không mong muốn.
Sử dụng .select()
Chúng ta có thể dùng phương thức .select() trong PySpark cùng với list comprehension để loại bỏ một hoặc nhiều cột dựa trên tiêu chí nhất định. Phương thức này linh hoạt, có thể dùng cho từ điều kiện đơn giản đến phức tạp.
Phương thức này có cú pháp df.select([col for col in df.columns if condition]), trong đó:
dflà DataFrame bạn đang làm việc.conditionlà tiêu chí dùng để lọc các cột bạn muốn giữ lại.
Hãy tiếp tục làm việc với DataFrame df và chọn tất cả các cột trừ cột team:
df_sel = df.select([col for col in df.columns if col != "team"])
Điều kiện phức tạp với .selectExpr()
Nếu bạn quen với SQL và cần áp dụng các điều kiện phức tạp hơn khi lọc cột, phương thức .selectExpr() của PySpark là một giải pháp mạnh mẽ. Nó cho phép sử dụng các biểu thức giống SQL để chọn và thao tác với cột trực tiếp trong mã PySpark.
Chẳng hạn, xem ví dụ sau:
# Chọn các cột cụ thể và tạo cột 'FullMatch' mới
df_sel = df.selectExpr("player_name", "player_position", "minutes_played >= 60 as FullMatch")
Ở đây, chúng ta không chỉ loại trừ một cột. Chúng ta đang:
- Chọn các cột
player_namevàplayer_position. - Tạo một cột mới tên là
FullMatchđể cho biết liệu một cầu thủ có chơi trọn vẹn trận đấu (60 phút trở lên) hay không.
Tính linh hoạt này khiến .selectExpr() trở nên vô cùng hữu ích trong những tình huống mà list comprehension đơn giản có thể không đủ.
Thực hành tốt nhất
Khi quyết định loại bỏ cột khỏi DataFrame, việc tuân theo một số thực hành tốt nhất là rất quan trọng để duy trì tính toàn vẹn dữ liệu, khả năng đọc của mã và hiệu quả.
1. Sao lưu dữ liệu: Trước khi sửa đổi DataFrame, đặc biệt là khi loại bỏ cột, hãy tạo một bản sao lưu. Điều này đảm bảo bạn có thể quay lại dữ liệu gốc khi cần.
df_backup = df.persist() # Cache DataFrame để tránh tính toán lại sau này
2. Loại bỏ với inplace=False (mặc định): Theo mặc định, phương thức .drop() trả về một DataFrame mới mà không sửa đổi bản gốc. Cách này nói chung an toàn hơn. Nếu bạn thật sự chắc chắn muốn sửa đổi DataFrame gốc, bạn có thể dùng inplace=True, nhưng hãy thận trọng.
df_dropped = df.drop("column_to_drop", inplace=False) # Hành vi mặc định
3. Ghi chú quyết định của bạn: Nếu làm việc trong dự án cộng tác hoặc dự đoán sẽ quay lại mã trong tương lai, hãy thêm chú thích giải thích vì sao bạn chọn loại bỏ một số cột. Tài liệu này cung cấp ngữ cảnh hữu ích cho bạn và người khác.
4. Cân nhắc đổi tên cột: Thay vì loại bỏ cột, hãy cân nhắc liệu việc đổi tên có phù hợp hơn không, đặc biệt nếu thông tin trong đó có thể hữu ích cho phân tích sau này. PySpark cung cấp phương thức .withColumnRenamed() để đổi tên cột.
Kết luận
Trong hướng dẫn này, chúng ta đã học cách loại bỏ một và nhiều cột bằng các phương thức .drop() và .select(). Chúng ta cũng đề cập đến các phương án thay thế để tận dụng biểu thức SQL nếu cần kỹ thuật chọn phức tạp hơn.
Nếu bạn muốn mở rộng kỹ năng và tận dụng các kỹ thuật mạnh mẽ của PySpark, hãy xem các khóa học và tài liệu sau:
Câu hỏi thường gặp
Làm thế nào để loại bỏ cột dựa trên regex trong PySpark?
Để loại bỏ các cột dựa trên mẫu regex trong PySpark, bạn có thể lọc tên cột bằng list comprehension và mô-đun re (biểu thức chính quy), sau đó truyền danh sách đã lọc vào phương thức .drop().
Làm sao để loại bỏ các cột có cùng tên trong PySpark?
PySpark không cho phép các tên cột trùng lặp trong một DataFrame. Nếu nguồn dữ liệu của bạn có tên trùng lặp, bạn có thể gặp lỗi khi tạo DataFrame. Thực hành tốt nhất là xử lý các tên trùng lặp ngay tại nguồn hoặc trong quá trình tạo DataFrame.
Làm sao để loại bỏ các cột chỉ có giá trị null trong PySpark?
Để loại bỏ các cột chỉ chứa giá trị null trong PySpark, trước tiên chúng ta có thể tính số lượng null trong mỗi cột bằng count(when(col(c).isNull(), c)). Sau đó, xác định các cột có số lượng null bằng với tổng số dòng của DataFrame. Cuối cùng, loại bỏ các cột này bằng phương thức .drop().
Làm sao để loại bỏ cột có điều kiện trong PySpark?
Sử dụng df.select([col for col in df.columns if condition]).
