我已经设置了一个调度程序和4个工作节点来对csv进行一些处理。 csv的大小只有300 MB。
df = dd.read_csv('/Downloads/tmpcrnin5ta',assume_missing=True)
df = df.groupby(['col_1','col_2']).agg('mean').reset_index()
df = client.persist(df)
def create_sep_futures(symbol,df):
symbol_df = copy.deepcopy(df[df['symbol' == symbol]])
return symbol_df
lazy_values = [delayed(create_sep_futures)(symbol, df) for symbol in st]
future = client.compute(lazy_values)
result = client.gather(future)
st list包含1000个元素
当我这样做时,我收到了这个错误:
distributed.worker - WARNING - Compute Failed
Function: create_sep_futures
args: ('PHG', symbol col_3 col_2 \
0 A 1.451261e+09 23.512857
1 A 1.451866e+09 23.886857
2 A 1.452470e+09 25.080429
kwargs: {}
Exception: KeyError(False,)
我的假设是工人应该获得完整的数据框和查询。但我认为它只是阻止并试图这样做。
它的解决方法是什么?由于数据帧块已经在工作者内存中。我不想将数据框移动到每个工作人员。
答案 0 :(得分:0)
默认情况下,使用数据框架语法和API对数据帧的操作是延迟(延迟),您不需要再做任何事情了。
第一个问题:您的语法错误df[df['symbol' == symbol]]
=> df[df['symbol'] == symbol]
。这是False
密钥的来源。
所以您可能正在寻找的解决方案:
future = client.compute(df[df['symbol'] == symbol])
如果你做想要单独处理这些块,你可以查看df.map_partitions
,它使用普通函数并负责传递数据或延迟/期货或{ {1}},它将为您提供一组延迟对象,您可以将它们与延迟函数一起使用。