多处理熊猫SQL

时间:2018-07-03 23:53:50

标签: python pandas multiprocessing pandasql

当我在mp库启动的每个处理器中对分块的Pandas数据帧进行多处理时,遇到表格未找到错误。
我通过以下方式将pandasql库用于SQL:

import pandasql import sqldf
pysqldf = lambda q: sqldf(q, globals())

df = pd.DataFrame({'a': [1,2,4,3,6,1,2], 'b': ['a','a','b','b','c','c','c']})

这适用于单线程:

sorted_df = pysqldf("select * from df order by b, a")

当我应用多重处理来处理df中的每个块时,它不起作用 平行:

def parallelize_dataframe(df, func):
    unique_bs = df.b.unique().tolist()
    df_split = [df[df.a == l] for l in unique_bs]
    df = pd.concat(pool.map(func, df_split))
    pool = Pool(num_cores)
    pool.close()
    pool.join()
    return df

def sort_chunks(data):
    sorted_data = pysqldf("select * from data order by b, a")
    return sorted_data

sorted_df = parallelize_dataframe(df, sort_chunks)

我得到的错误如下:

  

PandaSQLException:(sqlite3.OperationalError)没有这样的表:数据   [SQL:“从数据中选择*”](此错误的背景位于:   http://sqlalche.me/e/e3q8

我知道错误告诉我什么。基本上,在数据库中找不到每个处理器中的数据DF。我不确定该问题的解决方法是什么。任何输入将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

我知道了。问题是名称空间。本质上,pysqldf接受两个参数-查询和全局或局部名称空间。如果sqldf函数包装在函数内部,并且需要使用对该函数局部的数据框,则namespace参数应该是局部的。

在下面修改排序数据功能可解决此问题:

private async _openWeb(r, n): Promise<void> {
  const service = new MyService();
  const subs = await service.getSubs(n);

  const { webs } = this.state;
  const nIndex = webs.indexOf(n);

  this.setState({
    webs: [
      ...webs.slice(0, nIndex),
      { ...n, subs },
      ...webs.slice(nIndex + 1)
    ]
  })
}