Pyspark:将完整字典传递给每个任务

Pyspark:将完整字典传递给每个任务,pyspark,Pyspark,PySpark:我想传递我的自定义字典,其中包含PySpark中每个任务的几个位置的距离。对于rdd中的每一行,我需要计算每个位置和字典中每个位置的距离,并取最小距离。广播并没有解决我的问题 例如: dict={(a,3)、(b,6)、(c,2)} RDD: (位置1、5) (位置2、9) (位置3、8) 输出:(位置1,1) (位置2,3) (位置3,2) 请提供帮助并感谢在这种情况下,广播变量肯定会解决您的问题,不过您也可以在map函数中传递字典(或列表,请参见下文)。是否值得使用广播变量取

PySpark:我想传递我的自定义字典,其中包含PySpark中每个任务的几个位置的距离。对于rdd中的每一行,我需要计算每个位置和字典中每个位置的距离,并取最小距离。广播并没有解决我的问题

例如: dict={(a,3)、(b,6)、(c,2)} RDD: (位置1、5) (位置2、9) (位置3、8)

输出:(位置1,1) (位置2,3) (位置3,2)


请提供帮助并感谢

在这种情况下,广播变量肯定会解决您的问题,不过您也可以在map函数中传递字典(或列表,请参见下文)。是否值得使用广播变量取决于对象的大小

首先,因为您只需要最小距离,所以看起来您不关心字典的键,只关心值。如果对该列表进行排序,则可以有效地找到最小距离

d={'a':3,'b':6,'c':2} >>>位置=已排序(d.itervalues()) >>>rdd=sc.并行化([('location1',5),('location2',9),('location3',8)]) 现在定义一个函数,用以查找最小距离。我们从通用函数中生成单个元素的函数,用于修复第二个参数

>>从functools导入部分
>>>从对分导入对分
>>>def查找最小距离(位置、位置):
...     ind=对分(位置、位置)
...     如果ind==len(位置):
...         返回位置-位置[-1]
...     elif ind==0:
...         返回位置[0]-loc
...     其他:
...         左距离=位置[ind-1]
...         右距离=位置[ind]-位置
...         返回最小值(左距离、右距离)
>>>映射器=局部(查找最小距离,位置=位置)
>>>mapValues(mapper.collect())
[('location1',1),('location2',3),('location3',2)]
要使用广播变量执行此操作,请执行以下操作:

>>位置\u bv=sc.broadcast(位置)
>>>def映射器(loc):
...     返回查找最小距离(位置、位置值)
...
>>>mapValues(mapper.collect())
[('location1',1),('location2',3),('location3',2)]

将字典作为部分变量传递给映射器与作为广播变量访问字典之间的性能差异是什么?