广播变量在dask并行化中的使用

广播变量在dask并行化中的使用,dask,dask-distributed,Dask,Dask Distributed,我有一些在dask包上应用映射函数的代码。我需要一个查找字典来应用该函数,但它不适用于client.scatter 我不知道我是否做了正确的事情,因为工人们开始工作了,但他们什么也没做。我尝试了不同的配置,寻找不同的例子,但我无法让它工作。任何支持都将不胜感激 我从Spark知道,您定义了一个广播变量,并通过要应用的函数中的variable.value访问内容。我不认为达斯克也一样 #要映射的函数 def转换联系人添加到历史记录(数据、历史记录): 原始缓冲区=“” line=json.load

我有一些在dask包上应用映射函数的代码。我需要一个查找字典来应用该函数,但它不适用于client.scatter

我不知道我是否做了正确的事情,因为工人们开始工作了,但他们什么也没做。我尝试了不同的配置,寻找不同的例子,但我无法让它工作。任何支持都将不胜感激

我从Spark知道,您定义了一个广播变量,并通过要应用的函数中的variable.value访问内容。我不认为达斯克也一样

#要映射的函数
def转换联系人添加到历史记录(数据、历史记录):
原始缓冲区=“”
line=json.load(数据)
如果行['timestamp]>历史记录['timestamp]:
原始缓冲区=原始缓冲区+行['vid']
返回原始缓冲区
#主程序
#historic_dict是以前填充的字典,它是map函数的查找变量
#file_记录将是从S3文件获取的json.dump的列表
从分布式导入客户端
client=client()
历史记录分散=客户端。分散(历史记录,广播=真)
文件_记录=[]
原始数据=s3程序。读取原始文件(…s3文件……)
数据=文本包装器(原始数据)
对于行输入数据:
文件\u记录。追加(第行)
bag_chunk=db.from_序列(文件记录,npartitions=16)
bag\u transform=bag\u chunk.map(lambda x:transform\u contacts\u add\u to\u historic(x),args=[historic\u dict\u])
bag_transform.compute()

如果你的字典很小,你可以直接把它包括进去

def func(partition, d):
    return ...

my_dict = {...}

b = b.map(func, d=my_dict)
如果它很大,那么你可能想先用Dask包起来

my_dict = dask.delayed(my_dict)

b = b.map(func, d=my_dict)
如果它非常大,那么是的,您可能希望首先分散它(尽管如果使用上述任何一种方法,我都会避免这种情况)


非常感谢你。我的字典相当大(60万个键)。我不明白的是:如果我使用dask.delayed或client.scatter,我不需要计算dict?我是说,如果我用b.compute来计算dict?
[my_dict] = client.scatter([my_dict])

b = b.map(func, d=my_dict)