Trong tài liệu của Spark, nó nói rằng phương thức RDDs reduce
yêu cầu hàm nhị phân kết hợp và giao hoán.Spark: sự khác nhau về ngữ nghĩa giữa giảm và giảmByKey
Tuy nhiên, phương thức reduceByKey
CHỈ yêu cầu hàm nhị phân kết hợp.
sc.textFile("file4kB", 4)
Tôi đã thực hiện một số thử nghiệm và dường như đó là hành vi tôi nhận được. Tại sao sự khác biệt này? Tại sao reduceByKey
đảm bảo chức năng nhị phân luôn được áp dụng theo thứ tự nhất định (để phù hợp với việc thiếu tính giao hoán) khi reduce
không?
Ví dụ, nếu một tải một số (nhỏ) văn bản với 4 phân vùng (tối thiểu):
val r = sc.textFile("file4k", 4)
thì:
r.reduce(_ + _)
trả về một chuỗi nơi phụ tùng không phải lúc nào theo thứ tự, trong khi:
r.map(x => (1,x)).reduceByKey(_ + _).first
luôn trả về cùng một chuỗi (trong đó mọi thứ theo cùng thứ tự so với trong origina l tập tin).
(Tôi đã kiểm tra với r.glom
và nội dung tệp thực sự trải rộng trên 4 phân vùng, không có phân vùng trống).
Tôi đoán ý tưởng với 'reduceByKey' là bạn có thể có rất nhiều các khóa khác nhau để bạn có thể giảm mọi thứ cho một khóa duy nhất trên một chuỗi đơn lẻ, điều đó có nghĩa là bạn luôn có thể chạy tính toán từ trái sang phải. Ngược lại, 'reduce' sẽ thường được sử dụng trên một tập dữ liệu lớn, do đó, không được quan tâm đến thứ tự các hoạt động. –
Bạn đang sử dụng bao nhiêu trình thực thi trong thử nghiệm của mình? – gprivitera