使用ddf.read_sql_表-dask时出现类型错误 如果可以传递包含查询ddf.read\u sql\u table的sqlalchemy文本 如文档中所述,当传递用于读取sql表的参数时,请参见TypeError

使用ddf.read_sql_表-dask时出现类型错误 如果可以传递包含查询ddf.read\u sql\u table的sqlalchemy文本 如文档中所述,当传递用于读取sql表的参数时,请参见TypeError,dask,python-3.8,Dask,Python 3.8,代码: 从sqlalchemy.sql导入文本 从sqlalchemy.engine导入创建引擎 将dask.dataframe作为ddf导入 方言=“” SQL_驱动程序=“” 用户名=“” 密码=“” 主机名=“” 端口=“” SID=“” 引擎路径=方言+'++'+SQL驱动程序+'://'+用户名+':'+密码+'@'+主机名+':'+str(端口)+'/'+SID s=文本(“我的复杂sql查询”) df=ddf.read\u sql\u表(s,引擎路径,索引col='id',npar

代码:

从sqlalchemy.sql导入文本
从sqlalchemy.engine导入创建引擎
将dask.dataframe作为ddf导入
方言=“”
SQL_驱动程序=“”
用户名=“”
密码=“”
主机名=“”
端口=“”
SID=“”
引擎路径=方言+'++'+SQL驱动程序+'://'+用户名+':'+密码+'@'+主机名+':'+str(端口)+'/'+SID
s=文本(“我的复杂sql查询”)
df=ddf.read\u sql\u表(s,引擎路径,索引col='id',npartitions=10)
出现错误:

from sqlalchemy.sql import text
from sqlalchemy.engine import create_engine
import dask.dataframe as ddf


DIALECT = '<value>'
SQL_DRIVER= '<value>'
USERNAME= '<value>'
PASSWORD = '<value>'
HOSTNAME = '<value>'
PORT = '<value>'
SID = '<value>'
ENGINE_PATH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOSTNAME + ':' + str(PORT) + '/' + SID
s = text("My complicated sql query")
df = ddf.read_sql_table(s, ENGINE_PATH, index_col='id', npartitions=10)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/synology/data/ganesh/arun/code_jan_27/art_rematching/venv_3.8_50/lib/python3.8/site packages/dask/dataframe/io/sql.py”,第115行,在read_sql_表中
索引=表格。如果是INSTANCE(索引列,str),则列[索引列]为else索引列
TypeError:“方法”对象不可下标

因此dask目前不支持直接在文本机制中进行复杂查询(从v2021.02.0开始)。我的解决办法如下:

  • 将查询另存为数据库中的视图
  • 构造sqlalchemy uri字符串(正如您在问题中所做的那样)
  • 初始化指向视图的“表”对象
  • 将所有内容传递给read\u sql\u table函数
  • 下面是一个简单的例子:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/synology/data/ganesh/arun/code_jan_27/art_rematching/venv_3.8_50/lib/python3.8/site-packages/dask/dataframe/io/sql.py", line 115, in read_sql_table
        index = table.columns[index_col] if isinstance(index_col, str) else index_col
    TypeError: 'method' object is not subscriptable
    

    我也遇到了这个问题。运气好吗?我不再用达斯克了。我可能错了,但还有太多的事情要做。啊,我这方面肯定需要一些时间来适应。我确实为你的问题想出了一个解决办法——我会把它贴在回复中,以防你再回来。
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/synology/data/ganesh/arun/code_jan_27/art_rematching/venv_3.8_50/lib/python3.8/site-packages/dask/dataframe/io/sql.py", line 115, in read_sql_table
        index = table.columns[index_col] if isinstance(index_col, str) else index_col
    TypeError: 'method' object is not subscriptable
    
    from sqlalchemy import Table, Metadata, Column, Integer
    import dask.dataframe as ddf
    import multiprocessing
    
    uri = f'{dialect}://{user}:{password}@{host}:{port}/{dbName}'
    view = '[NAME_OF_VIEW]'
    schema = '[NAME_OF_SCHEMA]'
    pkey = '[PRIMARY_KEY_COLUMN]'
    myview = Table(view, Metadata(schema=schema), Column(pkey, Integer, primary_key=True))
    
    df = ddf.read_sql_table(table=myview, uri=uri, index_col=pkey, schema=schema, npartitions=multiprocessing.cpu_count()*3)