2015-06-25 25 views
7

Tôi tò mò chính xác cái gì đã truyền RDD cho một hàm trong Spark.Spark/Scala: Chuyển RDD đến Function

def my_func(x : RDD[String]) : RDD[String] = { 
    do_something_here 
} 

Giả sử chúng tôi xác định một hàm như trên. Khi chúng ta gọi hàm và truyền đối tượng RDD [String] hiện có làm tham số đầu vào, thì hàm my_function này có tạo một "bản sao" cho RDD này làm tham số hàm không? Nói cách khác, nó có được gọi là tham chiếu hay gọi theo giá trị không?

Trả lời

12

Trong Scala không có gì được sao chép (theo nghĩa của giá trị theo giá trị bạn có trong C/C++) khi được truyền xung quanh. Hầu hết các kiểu cơ bản Int, String, Double, vv là không thay đổi, vì vậy việc truyền chúng theo tham chiếu là rất an toàn. (Lưu ý: Nếu bạn đang truyền một đối tượng có thể thay đổi và bạn thay đổi nó, thì bất kỳ ai có tham chiếu đến đối tượng đó sẽ thấy thay đổi).

Ngày đầu đó, RDD là bộ sưu tập lười, phân phối, không thay đổi. Việc chuyển RDD qua các hàm và áp dụng transformation cho chúng (bản đồ, bộ lọc, v.v.) không thực sự chuyển bất kỳ dữ liệu nào hoặc kích hoạt bất kỳ tính toán nào.

biến đổi tất cả xiềng xích đang "nhớ" và sẽ tự động được kích hoạt theo thứ tự đúng khi bạn thực thi và action trên RDD, chẳng hạn như sự bền bỉ nó, hoặc thu thập nó tại địa phương vào người lái xe (thông qua collect(), take(n), vv)

4

Tia lửa thực hiện nguyên tắc "gửi mã tới dữ liệu" thay vì gửi dữ liệu đến mã. Vì vậy, ở đây nó sẽ xảy ra hoàn toàn ngược lại. Đây là hàm sẽ được phân phối và gửi đến RDD.

RDD là không thay đổi, do đó, chức năng của bạn sẽ tạo ra một RDD mới như là kết quả (chuyển đổi) hoặc tạo ra một số giá trị (hành động).

Câu hỏi thú vị ở đây là, nếu bạn xác định một hàm, chính xác những gì được gửi đến RDD (và phân phối giữa các nút khác nhau, với chi phí chuyển khoản của nó)? Một lời giải thích thú vị ở đây:

http://spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark

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