2016-01-13 19 views
13

Tôi chỉ nhận được hang của Spark, và tôi có chức năng mà cần phải được ánh xạ tới một rdd, nhưng sử dụng một cuốn từ điển toàn cầu:Broadcast một từ điển để RDD trong PySpark

from pyspark import SparkContext 

sc = SparkContext('local[*]', 'pyspark') 

my_dict = {"a": 1, "b": 2, "c": 3, "d": 4} # at no point will be modified 
my_list = ["a", "d", "c", "b"] 

def my_func(letter): 
    return my_dict[letter] 

my_list_rdd = sc.parallelize(my_list) 

result = my_list_rdd.map(lambda x: my_func(x)).collect() 

print result 

Trên đây đưa ra dự kiến kết quả; tuy nhiên, tôi thực sự không chắc chắn về việc tôi sử dụng biến toàn cầu my_dict. Có vẻ như một bản sao của từ điển được thực hiện với mọi phân vùng. Và nó không cảm thấy đúng ..

Nó trông giống như broadcast là những gì tôi đang tìm kiếm. Tuy nhiên, khi tôi cố gắng sử dụng nó:

my_dict_bc = sc.broadcast(my_dict) 

def my_func(letter): 
    return my_dict_bc[letter] 

tôi nhận được lỗi sau:

TypeError: 'Broadcast' object has no attribute '__getitem__ 

này dường như ngụ ý rằng tôi không thể phát sóng một cuốn từ điển.

Câu hỏi của tôi: Nếu tôi có một chức năng sử dụng từ điển chung, cần phải được ánh xạ tới rdd, cách thích hợp để làm điều đó là gì?

Ví dụ của tôi rất đơn giản, nhưng trên thực tế, my_dictmy_list lớn hơn nhiều và my_func phức tạp hơn.

Trả lời

15

Bạn quên điều gì đó quan trọng về các đối tượng Broadcast, chúng có thuộc tính được gọi là value nơi dữ liệu được lưu trữ.

Vì vậy, bạn cần phải sửa đổi my_func một cái gì đó như thế này:

my_dict_bc = sc.broadcast(my_dict) 

def my_func(letter): 
    return my_dict_bc.value[letter] 
+0

tôi thấy !, Vì vậy, khi tôi thêm 'my_dict_bc.value' nó hoạt động một cách chính xác. Và 'Broadcast' là một cách tiếp cận chuẩn để làm việc với các đối tượng đang được chia sẻ, đúng không? – Akavall

+0

Vâng, đó là một thực hành tốt, tuy nhiên nếu từ điển không phải là quá lớn, sau đó bạn có thể sử dụng một đối tượng toàn cầu mà không có bất kỳ vấn đề –

+0

Làm cho tinh thần. Cảm ơn bạn. – Akavall

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