python - 在 jupyter 笔记本中使用 pyspark 时如何指定驱动程序类路径?
问题描述
我想在 jupyter 笔记本中使用 pyspark 查询 PostgreSQL。我在 StackOverflow 上浏览了很多问题,但没有一个对我有用,主要是因为答案似乎已经过时了。这是我的最小代码:
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
url = 'jdbc:postgresql://host/dbname'
properties = {'user': 'username', 'password': 'pwd'}
df = spark.read.jdbc(url=url, table='tablename', properties=properties)
从笔记本运行它会引发以下错误:
Py4JJavaError: An error occurred while calling o69.jdbc.
: java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(DriverManager.java:315)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:85)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:85)
at scala.Option.getOrElse(Option.scala:121)...
我发现的主要技巧总结在下面的链接中,但不幸的是我无法让它们在我的笔记本中工作:
Pyspark 连接到 ipython 笔记本中的 Postgres 数据库
注意:我使用的是 Spark 2.3.1 和 Python 3.6.3,如果我指定 jar 位置,我可以从 pyspark shell 连接到数据库。
pyspark --driver-class-path /home/.../postgresql.jar --jars /home/.../jars/postgresql.jar
感谢任何可以帮助我解决这个问题的人。
编辑
如何在 IPython Notebook 中加载 jar 依赖项的答案已经列在我自己分享的链接中,对我不起作用。我已经尝试从笔记本配置环境变量:
import os
os.environ['PYSPARK_SUBMIT_ARGS'] = '--driver-class-path /path/to/postgresql.jar --jars /path/to/postgresql.jar'
文件路径或文件本身没有任何问题,因为当我指定它并运行 pyspark-shell 时它工作正常。
解决方案
使用该config
方法对我有用:
from pyspark.sql import SparkSession
spark = SparkSession.builder.config('spark.driver.extraClassPath', '/path/to/postgresql.jar').getOrCreate()
url = 'jdbc:postgresql://host/dbname'
properties = {'user': 'username', 'password': 'pwd'}
df = spark.read.jdbc(url=url, table='tablename', properties=properties)
推荐阅读
- c# - 从 C# 中的 XML 字符串中获取元素列表
- http-headers - 如何在 Nuxt 开发服务器中将自定义 http 标头添加到 Nuxt __page__ (不是静态资产!)?
- r - 如何使用 R 将列(类型)的 CHAR 长度修改为 1
- javascript - 如何在 React Native 中创建没有环绕视图的文本边框半径?
- azure-data-factory-2 - 如何在 ADF 中重命名链接服务
- c++ - 每 20 毫秒定期运行线程失败
- sql - 如何使用 Pgadmin 或 Postgresql 查询查找数据上传日期
- maven - 神器部署问题
- google-apps-script - 谷歌脚本中 array.indexOf() 的正则表达式匹配问题
- reactjs - 如何在反应js功能组件中停止多个API请求