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

时间:2019-05-21 08:22:36

标签: dask dask-distributed

我有一些代码在dask bag上应用了map函数。我需要一个查找字典来应用该功能,并且它不适用于client.scatter。

我不知道我是否做对了,因为工人开始了,但是他们什么也没做。我尝试了不同的配置以查找不同的示例,但无法使其正常工作。任何支持将不胜感激。

我从Spark知道,您定义了一个广播变量,然后通过要应用的函数中的variable.value访问内容。我对dask不太满意。

# Function to map
def transform_contacts_add_to_historic_sin(data,historic_dict):
    raw_buffer = ''
    line = json.loads(data)

    if line['timestamp] > historic_dict['timestamp]:
        raw_buffer = raw_buffer + line['vid']

    return raw_buffer

# main program
# historic_dict is a dictionary previously filled, which is the lookup variable for map function
# file_records will be a list of json.dump getting from a S3 file

from distributed import Client
client = Client()
historic_dict_scattered = client.scatter(historic_dict, broadcast=True)

file_records = []
raw_data = s3_procedure.read_raw_file(... S3 file.......)
data = TextIOWrapper(raw_data)
for line in data:
   file_records.append(line)

bag_chunk = db.from_sequence(file_records, npartitions=16)
bag_transform = bag_chunk.map(lambda x: transform_contacts_add_to_historic(x), args=[historic_dict_scattered])
bag_transform.compute()

1 个答案:

答案 0 :(得分:0)

如果您的词典很小,您可以直接将其包括在内

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)

如果它很大,则可以,您可能想先将其分散(尽管如果使用上述两种方法都可以解决的话,我都会避免这种情况。)

[my_dict] = client.scatter([my_dict])

b = b.map(func, d=my_dict)
相关问题