使用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
相关产品推荐
相关产品推荐

