2016-02-11 21 views
6

Tôi có một khung dữ liệu trong Spark 1.6 và muốn chỉ chọn một số cột trong số đó. Các tên cột là như:cách chọn tất cả các cột bắt đầu bằng nhãn chung

colA, colB, colC, colD, colE, colF-0, colF-1, colF-2 

Tôi biết tôi có thể làm như thế này để chọn cột cụ thể:

df.select("colA", "colB", "colE") 

nhưng làm thế nào để lựa chọn, nói "cola", "colB" và tất cả colF- * cột cùng một lúc? Có cách nào giống như trong Pandas không?

Trả lời

9

Trước tiên hãy lấy tên cột bằng df.columns, sau đó lọc xuống chỉ các tên cột bạn muốn .filter(_.startsWith("colF")). Điều này mang lại cho bạn một chuỗi các chuỗi. Nhưng lựa chọn mất select(String, String*). May mắn lựa chọn cho các cột là select(Column*), vì vậy cuối cùng chuyển đổi các chuỗi thành cột với .map(df(_)), và cuối cùng biến mảng của cột thành một arg arg với : _*.

df.select(df.columns.filter(_.startsWith("colF")).map(df(_)) : _*).show 

Bộ lọc này có thể phức tạp hơn (giống như gấu trúc). Tuy nhiên, đó là một giải pháp khá xấu xí (IMO):

df.select(df.columns.filter(x => (x.equals("colA") || x.startsWith("colF"))).map(df(_)) : _*).show 

Nếu danh sách các cột khác cố định, bạn cũng có thể hợp nhất một dãy cột cố định với mảng được lọc.

df.select((Array("colA", "colB") ++ df.columns.filter(_.startsWith("colF"))).map(df(_)) : _*).show 
+0

cảm ơn nhưng làm cách nào để chọn các cột khác, như được nêu trong câu hỏi? – user299791

+0

giải pháp chính xác cho vấn đề của tôi xuất phát từ hỗn hợp giải pháp thứ hai và thứ ba của bạn ... cảm ơn rất nhiều, bạn hoàn toàn nắm vững chủ đề – user299791

Các vấn đề liên quan