Như mọi người đều biết các trình phân vùng trong Spark có tác động hiệu suất rất lớn đối với bất kỳ hoạt động "rộng" nào, vì vậy nó thường được tùy chỉnh trong các hoạt động. Tôi đã thử nghiệm với đoạn mã sau:Trong Apache Spark, tại sao RDD.union không bảo vệ trình phân vùng?
val rdd1 =
sc.parallelize(1 to 50).keyBy(_ % 10)
.partitionBy(new HashPartitioner(10))
val rdd2 =
sc.parallelize(200 to 230).keyBy(_ % 13)
val cogrouped = rdd1.cogroup(rdd2)
println("cogrouped: " + cogrouped.partitioner)
val unioned = rdd1.union(rdd2)
println("union: " + unioned.partitioner)
Tôi thấy rằng theo mặc định cogroup()
luôn mang lại một RDD với phân vùng tùy chỉnh, nhưng union()
không, nó sẽ luôn luôn quay trở lại mặc định. Điều này phản trực giác vì chúng ta thường giả định rằng một PairRDD nên sử dụng phần tử đầu tiên của nó làm khóa phân vùng. Có cách nào để "buộc" Spark để hợp nhất 2 PairRDDs để sử dụng cùng một khóa phân vùng?
Có thực sự là RDD công nhận phân vùng mà tôi nghĩ là được cho là được sử dụng tự động trong trường hợp phân vùng có thể được bảo toàn; không chắc tại sao nó không được áp dụng ở đây. Xem https://github.com/apache/spark/blob/e0628f2fae7f99d096f9dd625876a60d11020d9b/core/src/test/scala/org/apache/spark/rdd/RDDSuite.scala#L123 và https://github.com/apache/spark /blob/master/core/src/main/scala/org/apache/spark/rdd/PartitionerAwareUnionRDD.scala –
Thật tuyệt vời! Không bao giờ biết về điều đó. Có vẻ như nó chỉ được sử dụng khi cả hai RDD có cùng một trình phân vùng. Tôi sẽ thêm nó vào câu trả lời, cảm ơn! –
Cảm ơn rất nhiều! Đây là một tối ưu hóa rất quan trọng. BTW nếu điều này không phải là tối ưu cho tất cả các trường hợp tôi luôn có thể viết một zip + trong phân công đoàn anyway – tribbloid