我正在尝试使用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 DB吗?
额外的问题,对于postgres数据库,如何在不导入外部jdbc的情况下正常工作?那是因为如果它安装在你的系统上,它会自动找到它吗?
答案 0 :(得分:1)
您可能还应该设置driver-class-path,因为jar只将jar文件发送给worker而不是驱动程序。
也就是说,在python代码中设置JVM配置时应该非常小心,因为您需要确保JVM加载它们(以后不能添加它们)。您可以尝试设置PYSPARK_SUBMIT_ARGS例如:
export PYSPARK_SUBMIT_ARGS =“ - jars jarname --driver-class-path jarname pyspark-shell”
这将告诉pyspark将这些选项添加到JVM加载,就像在命令行中添加它一样