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_dict
và my_list
lớn hơn nhiều và my_func
phức tạp hơn.
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
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 đề –
Làm cho tinh thần. Cảm ơn bạn. – Akavall