Modin调用read_sql查询Oracle时出现ORA-00933语法错误
Modin read_sql 读取Oracle数据触发ORA-00933语法错误问题
问题现象
调用Modin实现的read_sql接口读取数据时触发SQL语法错误,初步判断问题来自read_sql内部自动生成的count统计查询的子查询别名写法,暂无法确认是自身使用方式问题,还是Modin与Oracle数据库存在兼容性问题。
验证对比:传入完全相同的参数调用pandas.read_sql()不会触发该错误。
复现代码
import modin.pandas as pd query = """select distinct col_a, col_b FROM test_table""" df = pd.read_sql(query, conn)
报错信息
sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) ORA-00933: SQL command not properly ended
[SQL: SELECT COUNT(*) FROM (select distinct col_a, col_b FROM test_table) AS _]
问题根因
属于Modin与Oracle的语法兼容性问题:Oracle数据库语法不支持子查询别名前添加AS关键字,Modin内部为了统计数据总量自动生成count查询时,统一使用了AS _的子查询别名写法,刚好违反Oracle语法规则;而pandas原生read_sql不会自动生成这类前置count统计语句,因此不会触发报错。
临时解决方式
- 读取Oracle数据时先使用原生pandas的
read_sql接口拉取数据,得到DataFrame后再转为Modin格式做后续分布式处理 - 提前手动执行count查询拿到结果集总条数,通过
read_sql的对应参数传入预统计的行数,跳过Modin内部自动生成count查询的逻辑 - 本地修改Modin SQL生成逻辑的源码,去掉子查询别名前的
AS关键字,适配Oracle语法规则
内容的提问来源于stack exchange,提问作者kjmena
相关产品推荐
相关产品推荐

