【问题标题】:Multiprocessing Pandas SQL多处理 Pandas SQL
【发布时间】:2018-07-05 02:06:38
【问题描述】:

当我在 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) no such table: data [SQL:'select * from data'](此错误的背景: http://sqlalche.me/e/e3q8)

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

【问题讨论】:

    标签: python pandas multiprocessing pandasql


    【解决方案1】:

    我想通了。问题是命名空间。本质上,pysqldf 接受两个参数——查询和命名空间,它们可以是全局的,也可以是本地的。如果 sqldf 函数被包装在一个函数中并且需要使用该函数的本地数据框,则命名空间参数应该是本地的。

    将排序数据功能修改为以下解决了该问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2011-12-06
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多