Dask 并行SQL查询

Dask 并行SQL查询,dask,dask-delayed,Dask,Dask Delayed,如何使用dask并行运行具有不同列维度的SQL查询?以下是我的尝试: from dask.delayed import delayed from dask.diagnostics import ProgressBar import dask ProgressBar().register() con = cx_Oracle.connect(user="BLAH",password="BLAH",dsn = "BLAH") @delayed def loadsql(sql): retur

如何使用dask并行运行具有不同列维度的SQL查询?以下是我的尝试:

from dask.delayed import delayed
from dask.diagnostics import ProgressBar
import dask
ProgressBar().register()

con = cx_Oracle.connect(user="BLAH",password="BLAH",dsn = "BLAH")

@delayed
def loadsql(sql):
    return pd.read_sql_query(sql,con)

results = [loadsql(x) for x in sql_to_run] 

dask.compute(results)

df1=results[0]
df2=results[1]
df3=results[2]
df4=results[3]
df5=results[4]
df6=results[5]
但是,这会导致引发以下错误:

数据库错误:对sql执行失败:“sql查询” ORA-01013:用户请求取消当前操作 无法回滚

不久之后,又出现了另一个错误:

MultipleInstanceError:正在创建TerminalInteractiveShell的多个不兼容的子类实例。

sql\u to\u run是不同sql查询的列表

有什么建议或建议吗??谢谢


更新9.7.18

我认为这更像是我没有仔细阅读文档的情况。实际上,loadsql函数之外的con是导致问题的原因。下面是代码更改,现在似乎正在按预期工作

def loadsql(sql):
    con = cx_Oracle.connect(user="BLAH",password="BLAH",dsn = "BLAH")
    result =  pd.read_sql_query(sql,con)
    con.close()
    return result

values = [delayed(loadsql)(x) for x in sql_to_run] 
#MultiProcessing version
import dask.multiprocessing
results = dask.compute(*values, scheduler='processes')
#My sample queries took 56.2 seconds
#MultiThreaded version
import dask.threaded
results = dask.compute(*values, scheduler='threads')
#My sample queries took 51.5 seconds

我的猜测是,oracle客户端不是线程安全的。如果conn对象序列化,您可以尝试运行进程(通过使用多处理调度程序或分布式调度程序),这可能不太可能。更可行的方法是在
loadsql
中创建连接,这样每次调用都会重新创建连接,希望不同的连接不会相互干扰

我尝试了一种类似的方法将数据卸载到S3,即使使用8个线程,我也只能看到适度的(约20%)加速;您可以从尝试不同的调度程序开始,以防出现GIL效应。主要用例是将每个片段安全地放入内存中(我注意到您可以立即
计算
查询,但您可能希望在将所有内容放入主线程之前执行更多延迟操作和聚合)我猜您指的是OPYes,sorry@user32185;对于你的s3代码,我当然没见过,所以我猜不出来。