2015-05-20 25 views
6

Tôi đã có DataFrame mà tôi đang hoạt động và tôi muốn nhóm theo một nhóm cột và hoạt động theo nhóm trên các cột còn lại. Trong thường xuyên RDD -Đất Tôi nghĩ rằng nó sẽ giống như thế này:Spark DataFrame: hoạt động theo nhóm

rdd.map(tup => ((tup._1, tup._2, tup._3), tup)). 
    groupByKey(). 
    forEachPartition(iter => doSomeJob(iter)) 

trong DataFrame -Đất Tôi muốn bắt đầu như thế này:

df.groupBy("col1", "col2", "col3") // Reference by name 

nhưng sau đó tôi không chắc chắn làm thế nào để hoạt động trên các nhóm nếu hoạt động của tôi phức tạp hơn so với giá trị trung bình/phút/tối đa/số được cung cấp bởi GroupedData. Ví dụ, tôi muốn xây dựng một tài liệu MongoDB đơn trên mỗi nhóm ("col1", "col2", "col3") (bằng cách lặp qua các số s liên quan trong nhóm), chia tỷ lệ xuống phân vùng N, sau đó chèn tài liệu vào cơ sở dữ liệu MongoDB. Giới hạn N là số lượng kết nối đồng thời tối đa mà tôi muốn.

Bất cứ lời khuyên?

+2

Cách tốt nhất: Viết UDAF (chưa được hỗ trợ, xem SPARK-4233 và SPARK-3947). Cho đến lúc đó, sử dụng DF.RDD để truy cập các phương thức RDD như aggregateByKey để đạt được những gì bạn muốn xây dựng –

Trả lời

1

Bạn có thể tự tham gia. Đầu tiên có được các nhóm:

val groups = df.groupBy($"col1", $"col2", $"col3").agg($"col1", $"col2", $"col3") 

Sau đó, bạn có thể tham gia trở lại này đến DataFrame gốc:

val joinedDF = groups 
    .select($"col1" as "l_col1", $"col2" as "l_col2", $"col3" as "l_col3) 
    .join(df, $"col1" <=> $"l_col1" and $"col2" <=> $"l_col2" and $"col3" <=> $"l_col3") 

Trong khi điều này giúp bạn chính xác cùng một dữ liệu bạn có ban đầu (và với 3 bổ sung, cột dư thừa) bạn có thể thực hiện một phép nối khác để thêm một cột có ID tài liệu MongoDB cho nhóm (col1, col2, col3) được liên kết với hàng đó.

Ở mọi tốc độ, trong kinh nghiệm của tôi tham gia và tự tham gia là cách bạn xử lý các nội dung phức tạp trong DataFrames.

+0

Tôi không chắc chắn làm thế nào để lấy nó từ đó - điều gì sẽ cho phép tôi lặp qua tất cả các '$" col4 "' & '$ Các giá trị "col5" 'được liên kết với một kết hợp cụ thể' ($ "col1", $ "col2", $ "col3") '? –

+0

Cách DataFrames hoạt động, bạn chỉ có hai tùy chọn. Hoặc bạn làm một cái gì đó như toArray trên các nhóm, sau đó làm một foreach và bên trong các vòng tạo ra một DataFrame bằng cách lọc trên cols1 để cols3. Hoặc bạn phải làm tất cả trong một DataFrame duy nhất bằng cách sử dụng các phép nối phức tạp như tôi đang cố gắng ám chỉ. –

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