Aka*_*all 21 apache-spark pyspark
我只是得到了Spark的悬念,我有需要映射到的函数rdd,但是使用了一个全局字典:
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
Run Code Online (Sandbox Code Playgroud)
以上给出了预期的结果; 但是,我真的不确定我对全局变量的使用my_dict.似乎每个分区都会创建一个字典副本.它只是感觉不对..
看起来广播是我正在寻找的.但是,当我尝试使用它时:
my_dict_bc = sc.broadcast(my_dict)
def my_func(letter):
return my_dict_bc[letter]
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
TypeError: 'Broadcast' object has no attribute '__getitem__
Run Code Online (Sandbox Code Playgroud)
这似乎意味着我不能播放字典.
我的问题:如果我有一个使用全局字典的函数,需要将其映射到rdd,那么正确的方法是什么?
我的例子很简单,但在现实中my_dict,并my_list要大得多,而且my_func更加复杂.
Alb*_*nto 25
您忘记了有关Broadcast对象的重要内容,它们具有一个名为value的属性,用于存储数据.
因此,您需要修改my_func为以下内容:
my_dict_bc = sc.broadcast(my_dict)
def my_func(letter):
return my_dict_bc.value[letter]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13221 次 |
| 最近记录: |