Dask使用SQLAlchemy join作为Dask.dataframe.read_sql-index_col can';不要让熊猫和达斯克都高兴

Dask使用SQLAlchemy join作为Dask.dataframe.read_sql-index_col can';不要让熊猫和达斯克都高兴,dask,dask-distributed,dask-dataframe,Dask,Dask Distributed,Dask Dataframe,我创建了一个SQLAlchemy SQLAlchemy.sql.selective.Join对象,以便将多个表的连接拉入一个dask数据帧 加入def: join=TABLE1.join(TABLE2,TABLE1.c.COL1==TABLE2.c.COL2) 连接=连接的外部连接(表3,表1.c.COL1==表3.c.COL3) 连接=连接的外部连接(表4,表1.c.COL1==表4.c.COL4) join=join.join(表5,表1.c.COL5==表5.c.COL6) 连接=连接的外

我创建了一个SQLAlchemy SQLAlchemy.sql.selective.Join对象,以便将多个表的连接拉入一个dask数据帧

加入def:

join=TABLE1.join(TABLE2,TABLE1.c.COL1==TABLE2.c.COL2)
连接=连接的外部连接(表3,表1.c.COL1==表3.c.COL3)
连接=连接的外部连接(表4,表1.c.COL1==表4.c.COL4)
join=join.join(表5,表1.c.COL5==表5.c.COL6)
连接=连接的外部连接(表6,表5.c.COL7==表6.c.COL8)
连接=连接的外部连接(表7,表6.c.COL9==表7.c.COL10)
如果我像这样将一个子集读入pandas direct,它会起作用:

pd\u df\u join=pd.read\u sql\u查询(
join.select().limit(10000).compile(引擎,compile_kwargs={'literal_binds':True})。字符串,引擎,索引_col='COL1')
然而,如果我尝试对dask做同样的事情,我会遇到两个错误之一,Pandas或dask都找不到我所指的专栏。 熊猫:

In[15]:dd_df_join=dd.read_sql_table(join,engine_uri,index_col='SCHEMANAME_TABLE1'u COL1',limits=(110000),npartitions=1)
回溯(最近一次呼叫最后一次):
文件“/home/akettmann/venvs/tableau extract/lib/python3.7/site packages/IPython/core/interactiveshell.py”,第3331行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第1行,在
dd_df_join=dd.read_sql_表(join,engine_uri,index_col='SCHEMANAME'u TABLE1_COL1',limits=(110000),npartitions=1)
文件“/home/akettmann/venvs/tableau extract/lib/python3.7/site packages/dask/dataframe/io/sql.py”,第137行,在read_sql_表中
head=pd.read\u sql(q,引擎,**kwargs)
文件“/home/akettmann/venvs/tableau extract/lib/python3.7/site packages/pandas/io/sql.py”,第438行,以read_sql格式
chunksize=chunksize,
读取查询中的文件“/home/akettmann/venvs/tableau extract/lib/python3.7/site packages/pandas/io/sql.py”,第1237行
解析日期=解析日期,
文件“/home/akettmann/venvs/tableau extract/lib/python3.7/site packages/pandas/io/sql.py”,第129行,在结果中
frame.set\u index(index\u col,inplace=True)
文件“/home/akettmann/venvs/tableau extract/lib/python3.7/site packages/pandas/core/frame.py”,第4303行,在集合索引中
raise KeyError(f“列中没有{缺少}”)
KeyError:“['SCHEMANAME\u TABLE1\u COL1']中没有一个在列中”
达斯克:

[16]中的
:dd_df_join2=dd.read_sql_表(join,engine_uri,index_col='COL1',limits=(110000),npartitions=1)
回溯(最近一次呼叫最后一次):
文件“/home/akettmann/venvs/tableau extract/lib/python3.7/site packages/IPython/core/interactiveshell.py”,第3331行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第1行,在
dd_df_join2=dd.read_sql_表(连接,引擎uri,索引col='COL1',限制=(110000),npartitions=1)
文件“/home/akettmann/venvs/tableau extract/lib/python3.7/site packages/dask/dataframe/io/sql.py”,第110行,在read_sql_表中
索引=表格。如果是INSTANCE(索引列,str),则列[索引列]为else索引列
文件“/home/akettmann/venvs/tableau extract/lib/python3.7/site packages/sqlalchemy/util/_collections.py”,第194行,在u getitem中__
返回自。\u数据[键]
KeyError:'COL1'

我不确定是否有办法解决这个问题,或者我是不是在误导别人。非常感谢您的帮助

您的输入应该只是sql表达式,不要编译或混合表达式和字符串

在这种情况下,它可能看起来像

pd_df_join = dd.read_sql_table(join, engine_uri, index_col=TABLE1.c.COL1)

我不得不稍微修改一下,但至少现在我的问题是类型转换!哈:
python df=dd.read\u sql\u table(join,engine\u uri,index\u col=TABLE1.c.COL1.label('COL1'),limits=(11000),npartitions=1,head\u rows=1000)
(如果你真的只有一个分区,你可能不想使用dask)哦,我只使用了1个分区,因为我现在正在拉一小块,同时我在想我需要如何让东西说话。实际数据集为10s的GBs。在您看来,只为每个表创建一个帧并在dask中执行连接逻辑而不是跟踪类型转换错误之类的操作是否有意义?不,您的DB可能非常擅长从多个表进行连接,并且可能能够优化一些不必要的工作。当然,您可以进行基准测试……我发现我的问题的一部分是由于有一个表联接,但还有更多的条件/过滤器。一旦我给它一个空表连接,我的很多问题就消失了。我只是在Dask/Pandas中执行了我将在SQL中执行的过滤。现在工作起来很有魅力,拉取数据的速度要快得多,这样我就可以将数据带回pandas进行最终的数据清理。