如何从Amazon Workspace通过EMR Jupyter Lab读取PostgreSQL表并解决驱动错误
问题:读取PostgreSQL表时触发ClassNotFoundException错误
尝试从PostgreSQL表读取数据时,遇到以下错误:java.lang.ClassNotFoundException: org.postgresql.Driver。
注:使用私有Workspace,无法引用本地外部文件。
提供的JDBC示例URL:
"url":"jdbc:postgresql://xxxx-xxxxx-postgresql-prod01.cluster-xxxx.xx-xx-1.rds.amazonaws.com:0000/db_xxx_txxx",
完整错误栈信息:
An error was encountered: An error occurred while calling o153.jdbc. : java.lang.ClassNotFoundException: org.postgresql.Driver at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at org.apache.spark.sql.execution.datasources.jdbc.DriverRegistry$.register(DriverRegistry.scala:46) at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.$anonfun$driverClass$1(JDBCOptions.scala:102) at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.$anonfun$driverClass$1$adapted(JDBCOptions.scala:102) at scala.Option.foreach(Option.scala:407) at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:102) at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:38) at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:32) at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:355) at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:325) at org.apache.spark.sql.DataFrameReader.$anonfun$load$3(DataFrameReader.scala:307) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:307) at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:225) at org.apache.spark.sql.DataFrameReader.jdbc(DataFrameReader.scala:340) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) at py4j.Gateway.invoke(Gateway.java:282) at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) at py4j.commands.CallCommand.execute(CallCommand.java:79) at py4j.GatewayConnection.run(GatewayConnection.java:238) at java.lang.Thread.run(Thread.java:750)
使用的代码:
tables = read_table( url=URL, table="information_schema.tables", driver=DRIVER, user=USER, password=PASS )
解决方案
这个错误的核心是Spark运行环境中缺少PostgreSQL JDBC驱动包,针对私有Workspace无法引用本地文件的场景,可通过以下方式解决:
启动Spark时加载驱动包
用pyspark或spark-submit命令启动时,添加--packages参数引入官方驱动:pyspark --packages org.postgresql:postgresql:42.7.3 # 提交脚本时 spark-submit --packages org.postgresql:postgresql:42.7.3 your_script.py版本号可根据你的Spark和PostgreSQL版本调整,建议选用兼容的稳定版本。
在Workspace依赖配置中添加驱动
如果Workspace支持依赖管理(如Maven配置、内置依赖库),直接添加驱动依赖:- Maven风格配置:
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.7.3</version> </dependency> - 若用Python环境,可尝试执行
pip install pyspark[postgresql](部分环境支持),或确认Spark的全局依赖配置已包含该驱动。
- Maven风格配置:
验证驱动类配置
确保代码中DRIVER变量的值为org.postgresql.Driver,类名必须与驱动包中的完全一致,不能有拼写错误。
内容的提问来源于stack exchange,提问作者Sabarish Mahalingam
相关产品推荐
相关产品推荐

