从 PySpark 3.1.2 连接 Oracle DB - Py4JJavaError 失败

Posted

技术标签:

【中文标题】从 PySpark 3.1.2 连接 Oracle DB - Py4JJavaError 失败【英文标题】:Connecting Oracle DB from PySpark 3.1.2 - fails with Py4JJavaError 【发布时间】:2021-08-19 08:09:27 【问题描述】:

我正在使用 Oracle 11G 试用 PySpark3.2.1。它失败并出现以下错误:

Py4JJavaError: An error occurred while calling o44.load.
: java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)

我的代码:

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("PySpark_Oracle_Connection").getOrCreate()

driver = 'oracle.jdbc.OracleDriver'
url = 'jdbc:oracle:thin:@hostname:port/dbTEST'
user = 'myname'
password = 'mypswd'
table = 'mytable'

SPARK_CLASS_PATH = "C:\Oracle_Client\jdbc\lib\ojdbc8.jar"

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

请尽快提供帮助。之前的帖子都翻过了,还是不行。

【问题讨论】:

通过spark-submit提交spark应用时,您是否传递了这些参数---driver-class-path C:\Oracle_Client\jdbc\lib\ojdbc8.jar --jars C:\Oracle_Client\jdbc\lib\ojdbc8.jar 我正在使用 Spyder 执行。我不是开发人员。我是统计学家,只是通过向谷歌学习来尝试 PySpark 作为外行。如何在 Spyder pls 中的 python 代码中传递这个? 不确定 Spyder,但如果您已正确安装和配置了 spark,那么您将能够使用 spark-submit 命令运行 spark 应用程序。看看这个,还有一个 python 应用程序的信息 - spark.apache.org/docs/latest/submitting-applications.html 这些也是 - tutorialkart.com/apache-spark/… AND sparkbyexamples.com/spark/spark-submit-command 所有这些链接都在谈论如何在 Spark 上使用 Python。我需要如何在 windows10 中使用 jodbs.jar 运行 PySpark 包。我没有单独安装 Spark spark,但是我的 Spark 是 Anaconda 环境中 PySpark 包的一部分 - ~Anaconda3\Lib\site-packages\pyspark – 【参考方案1】:
Py4JJavaError: An error occurred while calling o44.load.
: java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver

错误本身表明了问题的根本原因,即当 spark 尝试从您的 oracle db 表中读取时,找不到 oracle.jdbc.OracleDriver 类。

所以现在,你只需要告诉 spark 找到你的罐子。这可以通过更改应该存在于$SPARK_HOME/conf/ 目录中的spark-defaults.conf 文件来完成。如果不存在,则使用以下配置自行添加:

spark.driver.extraClassPath C:\Oracle_Client\jdbc\lib\ojdbc8.jar
spark.executor.extraClassPath C:\Oracle_Client\jdbc\lib\ojdbc8.jar

或者在提交作业时只使用 --jars 选项。

【讨论】:

很抱歉在我的 windows10 中找不到 SPARK_HOME。从谷歌搜索中尝试了各种东西,似乎没有什么对我有用。我对Java或jar一无所知。我是一名尝试 PySpark 的统计人员。请告诉我如何在 Windows10 机器中找到/设置 SPARK_HOME。 在 Windows 命令提示符下,尝试echo %SPARK_HOME% 当我在 CMD 上提交“echo %SPARK_HOME%”时,它只返回“%SPARK_HOME%”,没有别的。我尝试在 Windows 配置中设置 %SPARK_HOME%,然后 PySpark 本身失败。我在 "~Anaconda3\Lib\site-packages\pyspark\conf.py" 有一个 conf 文件,但是我无法在其中指定 jdbc jar。谢谢

以上是关于从 PySpark 3.1.2 连接 Oracle DB - Py4JJavaError 失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyspark 从 hdfs 读取文件时连接被拒绝

使用 pyspark 连接配置单元表

hbase 与 pyspark 的集成

pyspark 与 MariaDB 的连接失败并出现 ClassNotFoundException

无法使用Pyspark从EMR群集连接到Snowflake

Pyspark中组连接函数的持久循环数据帧