在PySpark中将字典广播到rdd

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)