You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PySpark从Oracle抽取数据时遭遇ORA-00903错误求助

解决PySpark连接Oracle时ORA-00903无效表名错误

你的问题出在用dbtable参数传递完整SQL查询,PySpark的JDBC数据源中,dbtable参数用于指定表/视图名称,而不是直接放SELECT语句。当你直接传入查询时,Oracle会把整个SQL当成表名解析,自然报无效表名错误。

有两种修复方法:

方法1:使用query参数指定SQL查询

PySpark JDBC支持用query参数直接传递自定义查询语句,这是更直接的方式:

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('Spark_Job').getOrCreate()
driver = 'oracle.jdbc.driver.OracleDriver'
url = 'jdbc:oracle:thin:@XXXXXXXXXXXXXXXXXX/XXX'
user = 'XXXXX'
password = 'XXXXXXXX'
query = 'SELECT col_1 from schema_1.view_1'

# 替换dbtable为query参数
df = spark.read.format('jdbc')\
    .option('driver', driver)\
    .option('url', url)\
    .option('query', query)\
    .option('user', user)\
    .option('password', password)\
    .load()

df.show(10)

方法2:将查询包装为子查询传入dbtable

如果一定要用dbtable参数,需要把你的SELECT语句包装成子查询并指定别名(Oracle要求子查询必须有别名):

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('Spark_Job').getOrCreate()
driver = 'oracle.jdbc.driver.OracleDriver'
url = 'jdbc:oracle:thin:@XXXXXXXXXXXXXXXXXX/XXX'
user = 'XXXXX'
password = 'XXXXXXXX'
# 用括号包裹查询并加别名tmp
query = '(SELECT col_1 from schema_1.view_1) AS tmp'

df = spark.read.format('jdbc')\
    .option('driver', driver)\
    .option('url', url)\
    .option('dbtable', query)\
    .option('user', user)\
    .option('password', password)\
    .load()

df.show(10)

额外提醒:确保schema_1.view_1是你有权限访问的视图/表,当前数据库用户具备读取该对象的权限。

内容的提问来源于stack exchange,提问作者jun41D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:11:13