2017-11-08 14 views
5

Cho phép nói rằng tôi có tập dữ liệu với khoảng 2,1 tỷ bản ghi.pyspark Window.partitionBy vs groupBy

Đó là tập dữ liệu có thông tin khách hàng và tôi muốn biết số lần họ đã làm điều gì đó. Vì vậy, tôi nên nhóm trên ID và tổng một cột (Nó có giá trị 0 và 1 trong đó 1 chỉ ra một hành động).

Bây giờ, tôi có thể sử dụng đơn giản groupByagg(sum), nhưng theo hiểu biết của tôi thì điều này không thực sự hiệu quả. groupBy sẽ di chuyển xung quanh rất nhiều dữ liệu giữa các phân vùng.

Ngoài ra, tôi cũng có thể sử dụng chức năng Cửa sổ với mệnh đề partitionBy và sau đó tổng hợp dữ liệu. Một trong những bất lợi là sau đó tôi sẽ phải áp dụng một bộ lọc bổ sung gây ra nó giữ tất cả các dữ liệu. Và tôi muốn một bản ghi cho mỗi ID.

Nhưng tôi không thấy cách cửa sổ này xử lý dữ liệu. Là nó tốt hơn so với nhóm này và tổng hợp. Hay nó giống nhau?

Trả lời

3

Theo như tôi biết, khi làm việc với Tia lửa dữ liệu, hoạt động groupBy được tối ưu hóa qua Catalyst. groupBy trên DataFrames không giống như groupBy trên RDD.

Ví dụ: groupBy trên DataFrames thực hiện tổng hợp trên phân vùng trước, sau đó xáo trộn kết quả tổng hợp cho giai đoạn tổng hợp cuối cùng. Do đó, chỉ có kết quả tổng hợp giảm, bị xáo trộn, không phải toàn bộ dữ liệu. Điều này tương tự với reduceByKey hoặc aggregateByKey trên RDD. Xem chi tiết này có liên quan SO-article với một ví dụ tốt đẹp.

Ngoài ra, hãy xem trang trình bày 5 trong số này presentation bởi Yin Huai bao gồm các lợi ích của việc sử dụng DataFrames kết hợp với Chất xúc tác.

Kết luận, tôi cho rằng bạn đang sử dụng số groupBy khi sử dụng Tia lửa dữ liệu. Sử dụng Window dường như không phù hợp với tôi cho yêu cầu của bạn.