使用 PySpark 连接到 Oracle 数据库

Connect to Oracle DB using PySpark

我正在尝试使用 PySpark 连接到 Oracle 数据库。

spark_config = SparkConf().setMaster(config['cluster']).setAppName('sim_transactions_test').set("jars", "..\Lib\ojdbc7.jar")

sc = SparkContext(conf=spark_config)
sqlContext = SQLContext(sc)    

df_sim_input = self.sqlContext.read\
                        .format("jdbc")\
                        .option("driver", "oracle.jdbc.driver.OracleDriver")\
                        .option("url", config["db.url"])\
                        .option("dbtable", query)\
                        .option("user", config["db.user"])\
                        .option("password", config["db.password"])\
                        .load()

这给了我一个

py4j.protocol.Py4JJavaError: An error occurred while calling o31.load.
: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

所以它似乎无法在 SparkContext 中找到 jar 文件。似乎可以使用外部 jar 加载 PySpark shell,但我想从 Python 代码加载它们。

有人可以向我解释一下如何从 Python 添加这个外部 jar 并查询 Oracle 数据库吗?

额外的问题,对于 postgres 数据库,代码为何在不导入外部 jdbc 的情况下工作正常?是因为如果安装在你的系统上,它会自动找到它吗?

您可能还应该设置驱动程序-class-路径,因为 jars 仅将 jar 文件发送给工作人员,而不是驱动程序。

也就是说,在 python 代码中设置 JVM 配置时应该非常小心,因为您需要确保 JVM 加载它们(您不能稍后添加它们)。您可以尝试设置 PYSPARK_SUBMIT_ARGS 例如:

export PYSPARK_SUBMIT_ARGS="--jars jarname --driver-class-path jarname pyspark-shell"

这将告诉 pyspark 将这些选项添加到 JVM 加载中,就像您在命令行中添加它一样